Почему я не могу использовать управление заданиями в сценарии удара?

Mobx observable наблюдает только мелкие значения. Имеется в виду, скажем, у меня есть @observable claims[], тогда claims[0] = something запустит обновление, но claims[0].foo = bar не будет (документы) . Чтобы это исправить, вам нужно сделать foo также наблюдаемым, добавив @observable foo к объекту claim.

Рассмотрим следующий пример. Обратите внимание на разницу между Claim1 и Claim2. Компоненты точно такие же, но ClaimView2 обновится, а ClaimView1 - нет. Демо

import React from "react";
import { render } from "react-dom";
import { observable, action } from "mobx";
import { observer } from "mobx-react";

class Claim1 {
  moveOutDate: Date;
  constructor() {
    this.moveOutDate = new Date();
  }
}

@observer
class ClaimsView1 extends React.Component {
  @observable claims: Claim1[] = [
    new Claim1(),
    new Claim1()
  ];

  @action.bound
  updateClaims(){
    this.claims.forEach(claim => {
      claim.moveOutDate = new Date();
    })
  }

  render() {
    return 
        {"ClaimsView1 = \n" + JSON.stringify(this.claims, null, "  ")}
      
} } class Claim2 { @observable moveOutDate: Date; constructor() { this.moveOutDate = new Date(); } } @observer class ClaimsView2 extends React.Component { @observable claims: Claim2[] = [ new Claim2(), new Claim2() ]; @action.bound updateClaims(){ this.claims.forEach(claim => { claim.moveOutDate = new Date(); }) } render() { return
        {"ClaimsView2 = \n" + JSON.stringify(this.claims, null, "  ")}
      
} } render( <> , document.getElementById("root") );


Обновление:

Вот демонстрация для решения, которое я дал в комментариях

import React from "react";
import { render } from "react-dom";
import { observable, action } from "mobx";
import { observer } from "mobx-react";

interface IClaim {
  moveOutDate: Date;
}

@observer
class ClaimsView extends React.Component<{claims: IClaim[]}> {
  @observable claims: IClaim[] = this.props.claims.map(claim => observable(claim))

  updateClaims = () => {
    this.claims.forEach(claim => {
      claim.moveOutDate = new Date();
    })
  }

  render() {
    return 
        {"claims = \n" + JSON.stringify(this.claims, null, "  ")}
      
} } render( , document.getElementById("root") );

49
задан Community 23 May 2017 в 02:26
поделиться

4 ответа

То, что он имел в виду, - то, что управление заданиями по умолчанию выключено в неинтерактивном режиме (т.е. в сценарии.)

От bash страница справочника:

JOB CONTROL
       Job  control refers to the ability to selectively stop (suspend)
       the execution of processes and continue (resume) their execution at a
       later point.
       A user typically employs this facility via an interactive interface
       supplied jointly by the system’s terminal driver and bash.

и

   set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
      ...
      -m      Monitor mode.  Job control is enabled.  This option is on by
              default for interactive shells on systems that support it (see
              JOB CONTROL above).  Background processes run in a separate
              process group and a line containing their exit status  is
              printed  upon  their completion.

То, когда он сказал, "глупо", он подразумевал что не только:

  1. управление заданиями, предназначенное главным образом для упрощения интерактивного управления (тогда как сценарий может работать непосредственно с pid), но также и
  2. Я заключаю его исходный ответ в кавычки... полагается на то, что Вы не запустили никакие другие задания ранее в сценарии, который является плохим предположением для создания. Который довольно корректен.

ОБНОВЛЕНИЕ

В ответе на Ваш комментарий: да, никто не будет мешать Вам использовать управление заданиями в Вашем сценарии удара - нет никакого жесткого чехла для того, чтобы сильно запретить set -m (т.е. да, управление заданиями из сценария будет работать, если Вы захотите это к.) Помнят, что в конце, особенно в сценариях, всегда существует больше чем один способ освежевать кошку, но некоторые пути являются более портативными, более надежными, сделайте более простым обработать ошибочные случаи, проанализировать вывод, и т.д.

Вы конкретные обстоятельства могут или не могут гарантировать путь, отличающийся от какой lhunath (и другие пользователи), считают "лучшие практики".

42
ответ дан vladr 7 November 2019 в 11:43
поделиться

Управление заданиями полезно только, когда Вы выполняете интерактивную оболочку, т.е. Вы знаете, что stdin и stdout подключены к оконечному устройству (/dev/pts /* на Linux). Затем имеет смысл иметь что-то на переднем плане, что-то еще на фоне, и т.д.

Сценарии, с другой стороны, не имеют такой гарантии. Скрипты могут быть сделаны исполняемым файлом и запущены без любого присоединенного терминала. Не имеет смысла иметь приоритетные или фоновые процессы в этом случае.

Можно, однако, выполнить другие команды нев интерактивном режиме на фоне (добавление "и" к командной строке) и получить их PIDs с $!. Затем Вы используете kill уничтожить или приостановить их (моделирование Ctrl-C или Ctrl-Z на терминале, это оболочка была интерактивной). Можно также использовать wait (вместо fg) ожидать фонового процесса для окончания.

7
ответ дан Juliano 7 November 2019 в 11:43
поделиться

Bash действительно поддерживает управление заданиями, как Вы говорите. В записи сценария оболочки часто существует предположение, что Вы не можете полагаться на то, что у Вас есть удар, но что у Вас есть ванильная Оболочка Bourne (sh), который исторически не имел управления заданиями.

Мне трудно в эти дни воображать систему, в которой Вы честно ограничиваетесь реальной Оболочкой Bourne. Большинство систем /bin/sh будет связан с bash. Однако, это возможно. Одна вещь, которую можно сделать, вместо определения

#!/bin/sh

Можно сделать:

#!/bin/bash

Это и Ваша документация, прояснили бы Ваши потребности сценария bash.

2
ответ дан Peter 7 November 2019 в 11:43
поделиться

Возможно o/t, но я довольно часто использую nohup, когда ssh в сервер на продолжительном задании так, чтобы, если я выхожусь из системы, задание все еще завершилось.

Интересно, путают ли люди остановку и запуск с основной интерактивной оболочки и порождение фоновых процессов? Команда ожидания позволяет Вам порождать много вещей и затем ожидать их всех для завершения, и как я сказал, что использую nohup все время. Это более сложно, чем это и очень недогружено - sh, поддерживает этот режим также. Взгляните на руководство.

Вы также добрались

kill -STOP pid

Я довольно часто делаю это, если я хочу приостановить в настоящее время рабочий sudo, как в:

kill -STOP $$

Но горе случается с Вами, если Вы выскочили к оболочке от редактора - это будет все просто находиться там.

Я склонен использовать мнемосхему - УНИЧТОЖАЮТ и т.д., потому что существует опасность ввести

kill - 9 pid # note the space

и в былые времена Вы могли иногда снижать машину, потому что она уничтожит init!

0
ответ дан Ghoti 7 November 2019 в 11:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: