Обещание Js.все возвращается неправильно

#javascript #google-chrome-extension #promise

#javascript #google-chrome-расширение #обещание

Вопрос:

У меня есть несколько функций, которые я хотел бы выполнять параллельно с помощью обещаний (loadA, loadB, loadC).

 Promise.all([
  new Promise(loadA),
  new Promise(loadB),
  new Promise(loadC)
])
.then(checkFunction)
.catch(errorHandler);
 

Функции выглядят так:

 function loadA(){
   return load("A");
}
 

где A заменяется на B и C, где это уместно. Функция загрузки:

 function load(value) {
  return new Promise(function(resolve, reject) {
    chrome.storage.sync.get(value, function (result) {
      if(!exists(result)){
        console.log("tried to fetch "   value   " from sync, could not find");
        reject("could not find the user information");
      } else {
        console.log("fetched "   value   " from sync: "   result.userId);
        resolve(result);
      }
    });
  })
}
 

«`

Я провожу некоторое тестирование, и когда функция загрузки отправляет обещание reject , что-то идет не так. Функция ‘next-in-line’ есть checkFunction , и она не вызывается, как errorHandler и функция. Я подтвердил, что load обещание фактически отклоняется, потому что консоль показывает 3 оператора «пытался извлечь …».

Я также не понимаю, почему я вижу 3 tried to fetch.. утверждения с момента спецификации для Promise.все указывает, что оно вернется, как только одно из обещаний будет отклонено или после того, как все обещания будут разрешены (источник: http://mzl.la/1jLTOHB ). Мое наблюдаемое поведение не соответствует ни одному из этих сценариев, что я могу делать неправильно?

Ответ №1:

Поскольку ваша функция загрузки уже создает и возвращает обещание, мне кажется, что вы просто хотите этого:

 Promise.all([
  loadA(),
  loadB(),
  loadC()
])
.then(checkFunction)
.catch(errorHandler);
 

То, как вы структурировали свой код, означает, что вы запускаете три операции, которые выполняются параллельно для загрузки «A», «B» и «C». Эти три операции выполняются независимо и, следовательно, почему вы видите три сообщения «пытался извлечь …» (по одному внутри каждой операции). Только за пределами этих трех независимых операций Promise.all() будет рассмотрен статус разрешения / отклонения и принято решение о том, что делать дальше.


И, на самом деле, вы могли бы упростить это:

 Promise.all([
  load("A"),
  load("B"),
  load("C")
])
.then(checkFunction)
.catch(errorHandler);
 

Как у вас это было, внешние обещания, которые вы создавали, никогда не разрешались или не отклонялись, .then() или .catch() никогда не запускались. Только внутренние обещания внутри вашей load() функции разрешались или отклонялись.

Комментарии:

1. Я попробовал первый синтаксис, который вы предоставили, но забыл включить () , как я думал, я передавал в самих функциях. Спасибо!

2. @jfriend00 что мне нужно сделать, если я хочу перейти к внешнему перехвату в том же.

3. @SaurabhChauhan — Я не понимаю, что означает ваш комментарий. Возможно, вам следует опубликовать свой собственный вопрос, показать свой код и объяснить подробнее.