Можно ли иметь несколько потребителей по одному обещанию? - PullRequest
0 голосов
/ 28 августа 2018

Пример кода:

const googleLoadPromise = new Promise(function (resolve, reject) {
   google.charts.setOnLoadCallback(function () {
    resolve(1);
  });
});

googleLoadPromise.then(function () {
 // consumer 1 - do something               
});

googleLoadPromise.then(function () {
 // comsumer 2 - do something else               
});

т.е. для googleLoadPromise есть два потребителя. Такого рода картина в порядке? Кажется, все работает нормально - то есть звонят обоим потребителям, и они не создают проблем друг для друга.

Кроме того, если все в порядке, является ли порядок запуска потребителей детерминированным (просто из интереса, больше всего)?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Это нормально?

Конечно, это основной вариант использования обещаний.

является ли порядок запуска потребителей детерминированным (просто из интереса, больше всего на свете)?

Да, обратный вызов, прикрепленный сначала с then, выполняется первым, однако я бы не стал полагаться на него. Если вы хотите запускать один обратный вызов за другим, соедините их соответствующим образом.

 // ok:
 promise
   .then(first);
 promise
   .then(second);

  // better if second depends on first:
 promise
   .then(first)
   .then(second);
0 голосов
/ 28 августа 2018

Да, конечно. Вы также можете просто сделать это, если вы хотите запустить обе функции в последовательности:

const googleLoadPromise = new Promise(function (resolve, reject) {
  google.charts.setOnLoadCallback(function () {
    resolve(1);
  });
});

googleLoadPromise
  .then(function () {
    // consumer 1 - do something
  }).then(function () {
    // comsumer 2 - do something else
});

Также не забывайте обрабатывать отклонения и catch ваше обещание.


Обещания также становятся намного проще с async await. Приведенный ниже пример более соответствует тому, что вы написали:

const googleLoadPromise = new Promise(function (resolve, reject) {
  google.charts.setOnLoadCallback(function () {
    resolve(1);
  });
});


function1 = () => {
  // consumer 1 - do something
}

function2 = () => {
  // consumer 1 - do something
}

(async function() {
  try {
    const result = await googleLoadPromise();

    function1();
    function2();
  }
  catch( error ) {
    console.error( error );
  }
}());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...