Nano Hash - криптовалюты, майнинг, программирование

Обработка ошибок в Promise.all

У меня есть массив обещаний, которые я разрешаю с помощью Promise.all(arrayOfPromises);

Я продолжаю цепочку обещаний. Выглядит примерно так

existingPromiseChain = existingPromiseChain.then(function() {
  var arrayOfPromises = state.routes.map(function(route){
    return route.handler.promiseHandler();
  });
  return Promise.all(arrayOfPromises)
});

existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
  // do stuff with my array of resolved promises, eventually ending with a res.send();
});

Я хочу добавить оператор catch для обработки отдельного обещания в случае его ошибки, но когда я пытаюсь, Promise.all возвращает первую найденную ошибку (игнорируя остальные), а затем я не могу получить данные из остальных обещаний. в массиве (это не ошибка).

Я пробовал делать что-то вроде ..

existingPromiseChain = existingPromiseChain.then(function() {
      var arrayOfPromises = state.routes.map(function(route){
        return route.handler.promiseHandler()
          .then(function(data) {
             return data;
          })
          .catch(function(err) {
             return err
          });
      });
      return Promise.all(arrayOfPromises)
    });

existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
      // do stuff with my array of resolved promises, eventually ending with a res.send();
});

Но это не решает.

Спасибо!

--

Редактировать:

Ответы ниже были полностью правдой, код ломался по другим причинам. Если кому-то интересно, это решение, к которому я пришел ...

Цепочка серверов Node Express

serverSidePromiseChain
    .then(function(AppRouter) {
        var arrayOfPromises = state.routes.map(function(route) {
            return route.async();
        });
        Promise.all(arrayOfPromises)
            .catch(function(err) {
                // log that I have an error, return the entire array;
                console.log('A promise failed to resolve', err);
                return arrayOfPromises;
            })
            .then(function(arrayOfPromises) {
                // full array of resolved promises;
            })
    };

Вызов API (вызов route.async)

return async()
    .then(function(result) {
        // dispatch a success
        return result;
    })
    .catch(function(err) {
        // dispatch a failure and throw error
        throw err;
    });

Помещение .catch для Promise.all перед .then, похоже, послужило цели отлова любых ошибок из исходных обещаний, но затем возвращение всего массива к следующему .then

Спасибо!

21.05.2015

  • Кажется, ваша попытка должна сработать ... может быть, где-то позже возникнет другая проблема? 21.05.2015
  • .then(function(data) { return data; }) можно полностью опустить 21.05.2015
  • Единственная причина, по которой вышеуказанное не должно разрешаться, заключается в том, что вы не показываете нам весь код в обработчиках then или catch, и внутри возникает ошибка. Кстати, это узел? 21.05.2015
  • У вас нет окончательной ловушки в существующей цепочке, поэтому могут быть ошибки, которых вы не видите, которые могут объяснить, почему она не разрешается. Попробуйте добавить это и посмотрите, какую ошибку вы получите. 21.05.2015
  • вот ответ: stackoverflow.com/questions/31424561/ 14.08.2018
  • возможный дубликат Подождите, пока не будут выполнены все обещания ES6, даже отклоненные обещания 28.02.2019

Ответы:


1

Promise.all - все или ничего. Он разрешается, как только разрешаются все обещания в массиве, или отклоняется, как только одно из них отклоняется. Другими словами, он либо разрешается с массивом всех разрешенных значений, либо отклоняется с единственной ошибкой.

В некоторых библиотеках есть что-то под названием Promise.when, которое, как я понимаю, вместо этого будет ждать, пока все обещания в массиве будут либо разрешены, либо отклонены, но я не знаком с этим, и его нет в ES6.

Ваш код

Я согласен с другими здесь, что ваше исправление должно работать. Он должен разрешиться с помощью массива, который может содержать сочетание успешных значений и объектов ошибок. Необычно передавать объекты ошибок в успешном пути, но если предположить, что ваш код ожидает их, я не вижу в этом проблем.

Единственная причина, по которой я могу придумать, почему он «не разрешается», заключается в том, что он не работает в коде, который вы не показываете нам, и причина, по которой вы не видите никаких сообщений об ошибке, заключается в том, что эта цепочка обещаний не завершается финальным поймать (насколько то, что вы нам показываете).

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

Promise.all(state.routes.map(function(route) {
  return route.handler.promiseHandler().catch(function(err) {
    return err;
  });
}))
.then(function(arrayOfValuesOrErrors) {
  // handling of my array containing values and/or errors. 
})
.catch(function(err) {
  console.log(err.message); // some coding error in handling happened
});
21.05.2015
  • Вы (и вышеприведенные комментарии) были правы. Моему route.handler.promiseHandler нужно было .catch () и вернуть ошибку. Мне также нужно было добавить последний .catch () в конец цепочки. Спасибо за то, что рассказали о важности наличия обработчиков успеха / ошибок на каждом этапе цепочки :). 21.05.2015
  • Я также обнаружил, что если я выброшу ошибку в моем .catch () для route.handler.promiseHandler, он автоматически перейдет к финальному улову. Если вместо этого я верну ошибку, он сделает то, что я хочу, и обработает весь массив. 21.05.2015
  • Сейчас есть стандартный метод Promise.allSettled() с приличной поддержкой. См. справочник. 09.04.2020
  • Да, Promise.all выходит из строя, когда выходит из строя первый поток. Но, к сожалению, все остальные потоки продолжают работать, пока не закончатся. Ничего не отменяется, даже хуже: нет возможности отменить поток в Promise. Итак, что бы потоки ни делали (и ни манипулировали), они продолжают, они меняют состояния и переменные, они используют ЦП, но в конце они не возвращают свой результат. Вы должны знать об этом, чтобы не создавать хаоса, например при повторении / повторном вызове. 09.05.2020

  • 2

    НОВЫЙ ОТВЕТ

    const results = await Promise.all(promises.map(p => p.catch(e => e)));
    const validResults = results.filter(result => !(result instanceof Error));
    

    FUTURE Promise API

    03.09.2017
  • Хотя e не обязательно должен быть Error. Это может быть строка, например, если кто-то вернет ее как Promise.reject('Service not available'). 27.02.2019
  • @ArturKlesun, как мы могли тогда классифицировать, какое из обещаний привело к ошибке, а какое - нет? 12.05.2019
  • @ shubham-jain с .then() и .catch(). Promise.resolve() передаст значение первому, тогда как Promise.reject() передаст его второму. Вы можете заключить их в объект, например: p.then(v => ({success: true, value: v})).catch(e => ({success: false, error: e})). 13.05.2019
  • Зачем вам фильтровать результаты? Это не имеет смысла, если вы что-то делаете с результатами - вам нужен порядок, чтобы знать, какое возвращаемое значение из какого обещания! 24.06.2019

  • 3

    ES2020 представляет новый метод для типа Promise: Promise.allSettled().

    Promise.allSettled дает вам сигнал, когда все входные обещания выполнены, что означает, что они либо выполнены, либо отклонены. Это полезно в тех случаях, когда вас не волнует состояние обещания, вы просто хотите знать, когда работа будет выполнена, независимо от того, была ли она успешной.

    (async function() {
      const promises = [
        fetch('//api.stackexchange.com/2.2'), // succeeds
        fetch('/this-will-fail') // fails
      ];
    
      const result = await Promise.allSettled(promises);
      console.log(result.map(promise => promise.status));
      // ['fulfilled', 'rejected']
    })();

    Подробнее читайте в записи блога v8.

    21.12.2019
  • должно быть s=>s.status 03.08.2020

  • 4

    Чтобы продолжить цикл Promise.all (даже если Promise отклоняет), я написал служебную функцию, которая называется executeAllPromises. Эта служебная функция возвращает объект с results и errors.

    Идея состоит в том, что все обещания, которые вы передаете executeAllPromises, будут заключены в новое обещание, которое всегда будет разрешаться. Новое обещание разрешается с помощью массива с двумя точками. Первая точка содержит значение разрешения (если есть), а вторая точка содержит ошибку (если завернутый Promise отклоняет).

    В качестве последнего шага executeAllPromises накапливает все значения обернутых обещаний и возвращает окончательный объект с массивом для results и массивом для errors.

    Вот код:

    function executeAllPromises(promises) {
      // Wrap all Promises in a Promise that will always "resolve"
      var resolvingPromises = promises.map(function(promise) {
        return new Promise(function(resolve) {
          var payload = new Array(2);
          promise.then(function(result) {
              payload[0] = result;
            })
            .catch(function(error) {
              payload[1] = error;
            })
            .then(function() {
              /* 
               * The wrapped Promise returns an array:
               * The first position in the array holds the result (if any)
               * The second position in the array holds the error (if any)
               */
              resolve(payload);
            });
        });
      });
    
      var errors = [];
      var results = [];
    
      // Execute all wrapped Promises
      return Promise.all(resolvingPromises)
        .then(function(items) {
          items.forEach(function(payload) {
            if (payload[1]) {
              errors.push(payload[1]);
            } else {
              results.push(payload[0]);
            }
          });
    
          return {
            errors: errors,
            results: results
          };
        });
    }
    
    var myPromises = [
      Promise.resolve(1),
      Promise.resolve(2),
      Promise.reject(new Error('3')),
      Promise.resolve(4),
      Promise.reject(new Error('5'))
    ];
    
    executeAllPromises(myPromises).then(function(items) {
      // Result
      var errors = items.errors.map(function(error) {
        return error.message
      }).join(',');
      var results = items.results.join(',');
      
      console.log(`Executed all ${myPromises.length} Promises:`);
      console.log(`— ${items.results.length} Promises were successful: ${results}`);
      console.log(`— ${items.errors.length} Promises failed: ${errors}`);
    });

    06.01.2017
  • Это можно сделать проще. См. stackoverflow.com/a/36115549/918910 09.01.2017

  • 5

    Как сказал @jib,

    Promise.all - все или ничего.

    Тем не менее, вы можете управлять определенными обещаниями, которым «разрешено» невыполнение, и мы хотели бы перейти к .then.

    Например.

      Promise.all([
        doMustAsyncTask1,
        doMustAsyncTask2,
        doOptionalAsyncTask
        .catch(err => {
          if( /* err non-critical */) {
            return
          }
          // if critical then fail
          throw err
        })
      ])
      .then(([ mustRes1, mustRes2, optionalRes ]) => {
        // proceed to work with results
      })
    
    14.02.2019

    6

    Promise.allSettled

    Вместо Promise.all используйте Promise.allSettled, который ожидает выполнения всех обещаний, независимо от результат

    let p1 = new Promise(resolve => resolve("result1"));
    let p2 = new Promise( (resolve,reject) => reject('some troubles') );
    let p3 = new Promise(resolve => resolve("result3"));
    
    // It returns info about each promise status and value
    Promise.allSettled([p1,p2,p3]).then(result=> console.log(result));

    Полифилл

    if (!Promise.allSettled) {
      const rejectHandler = reason => ({ status: 'rejected', reason });
      const resolveHandler = value => ({ status: 'fulfilled', value });
    
      Promise.allSettled = function (promises) {
        const convertedPromises = promises
          .map(p => Promise.resolve(p).then(resolveHandler, rejectHandler));
        return Promise.all(convertedPromises);
      };
    }

    29.06.2020
  • обратите внимание, как описано здесь: developer.mozilla.org/en -US / docs / Web / JavaScript / Reference /, что он не поддерживает Firefox для Android. 13.07.2020
  • @adirabargil благодарит за эту информацию - для этого есть полифилл 13.07.2020

  • 7

    Использование Async await -

    здесь одна асинхронная функция func1 возвращает разрешенное значение, а func2 выдает ошибку и возвращает нуль в этой ситуации, мы можем обрабатывать ее так, как мы хотим, и соответственно возвращать.

    const callingFunction  = async () => {
        const manyPromises = await Promise.all([func1(), func2()]);
        console.log(manyPromises);
    }
    
    
    const func1 = async () => {
        return 'func1'
    }
    
    const func2 = async () => {
        try {
            let x;
            if (!x) throw "x value not present"
        } catch(err) {
           return null
        }
    }
    
    callingFunction();
    

    Вывод - ['func1', null]

    18.03.2019

    8

    если вы используете q-библиотеку https://github.com/kriskowal/q, она имеет q. allSettled (), который может решить эту проблему, вы можете обрабатывать каждое обещание в зависимости от его состояния: полное или отклоненное, поэтому

    existingPromiseChain = existingPromiseChain.then(function() {
    var arrayOfPromises = state.routes.map(function(route){
      return route.handler.promiseHandler();
    });
    return q.allSettled(arrayOfPromises)
    });
    
    existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
    //so here you have all your promises the fulfilled and the rejected ones
    // you can check the state of each promise
    arrayResolved.forEach(function(item){
       if(item.state === 'fulfilled'){ // 'rejected' for rejected promises
         //do somthing
       } else {
         // do something else
       }
    })
    // do stuff with my array of resolved promises, eventually ending with a res.send();
    });
    
    19.06.2016
  • Поскольку вы предлагаете использовать некоторую библиотеку (q), было бы более полезно, если бы вы предоставили пример использования, связанный с вопросом. В существующем виде ваш ответ не объясняет, как эта библиотека может помочь в решении проблемы. 19.06.2016
  • добавил пример, как предложено 19.06.2016
  • Примерно в 2018 году всегда нужно видеть то, что есть в Синдре :-). github.com/sindresorhus/p-settle. С одноцелевыми модулями Sindre вам не нужно импортировать огромную библиотеку, такую ​​как q, всего за один бит. 19.05.2018

  • 9

    Для тех, кто использует ES8 и которые здесь спотыкаются, вы можете сделать что-то вроде следующего, используя асинхронные функции:

    var arrayOfPromises = state.routes.map(async function(route){
      try {
        return await route.handler.promiseHandler();
      } catch(e) {
        // Do something to handle the error.
        // Errored promises will return whatever you return here (undefined if you don't return anything).
      }
    });
    
    var resolvedPromises = await Promise.all(arrayOfPromises);
    
    17.09.2018

    10

    Вы рассматривали Promise.prototype.finally()?

    Кажется, он разработан для того, чтобы делать именно то, что вы хотите - выполнять функцию после того, как все обещания будут урегулированы (разрешены / отклонены), независимо от того, некоторые из обещаний были отклонены.

    Из документации MDN:

    Метод finally() может быть полезен, если вы хотите выполнить некоторую обработку или очистку после выполнения обещания, независимо от его результата.

    Метод finally() очень похож на вызов .then(onFinally, onFinally), но есть несколько отличий:

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

    Обратный вызов finally не получит никаких аргументов, поскольку нет надежных средств определения того, было ли обещание выполнено или отклонено. Этот вариант использования предназначен именно для тех случаев, когда вас не волнует причина отказа или ценность выполнения, и поэтому нет необходимости указывать ее.

    В отличие от Promise.resolve(2).then(() => {}, () => {}) (который будет разрешен с помощью undefined), Promise.resolve(2).finally(() => {}) будет разрешен с помощью 2. Точно так же, в отличие от Promise.reject(3).then(() => {}, () => {}) (который будет выполнен с undefined), Promise.reject(3).finally(() => {}) будет отклонен с 3.

    == Откат ==

    Если ваша версия JavaScript не поддерживает Promise.prototype.finally(), вы можете использовать этот обходной путь из Джейка Арчибальда: Promise.all(promises.map(p => p.catch(() => undefined)));

    13.12.2018
  • Да, пока Promises.allSettled() не будет фактически реализован (это задокументировано MDN здесь), то Promises.all.finally(), похоже, выполняет то же самое. Я собираюсь попробовать ... 29.06.2019
  • @jamess Почему бы тебе не сделать этот комментарий как правильный ответ? Ни один из ответов не относится к ES6 allSettled(). 12.10.2019
  • @pravin - Насколько я могу судить, allSettled() нигде не реализован (пока), поэтому я не хочу опережать реальность. Я добился успеха с Promises.all(myPromiseArray).finally(), и это соответствует этому ответу. Как только allSettled() действительно существует, я могу протестировать его и выяснить, как он на самом деле работает. А пока, кто знает, что на самом деле будут реализовывать браузеры? Если у вас нет недавней информации об обратном ... 13.10.2019
  • @jamess Верно, что он все еще находится на стадии черновика .. однако последние версии FF и Chrome, похоже, полностью поддерживают его .. Не уверен в его стабильности, хотя .. Mozilla Docs В любом случае, я пытался сказать, что найти ответ было бы намного проще, чем комментарий .. это ур звоните, хотя :) 17.10.2019
  • @pravin - На тот момент, когда я разместил свой комментарий, он нигде не был реализован. Я только что тестировал в Firefox и Chrome: Promise.allSettled не реализован в Firefox, но, похоже, он существует в Chrome. То, что в документации говорится, что это реализовано, не означает, что это действительно реализовано. Я не собираюсь использовать его в ближайшее время. 18.10.2019
  • @jamess Круто .. в любом случае .. комментарий мне помог .. спасибо за это 18.10.2019

  • 11

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

    Здесь я отклонил первое обещание, поэтому оно не определено, но мы можем использовать результат второго обещания, который имеет индекс 1.

    const manyPromises = Promise.all([func1(), func2()]).then(result => {
        console.log(result[0]);  // undefined
        console.log(result[1]);  // func2
    });
    
    function func1() {
        return new Promise( (res, rej) => rej('func1')).catch(err => {
            console.log('error handled', err);
        });
    }
    
    function func2() {
        return new Promise( (res, rej) => setTimeout(() => res('func2'), 500) );
    }

    03.09.2018
  • Как можно сделать то же самое, если использовать async await? 25.02.2019
  • Я ответил на ваш вопрос, пожалуйста, найдите ссылку для ответа. stackoverflow.com/a/55216763/4079716 18.03.2019

  • 12

    Promise.all поставил с фильтром

    const promises = [
      fetch('/api-call-1'),
      fetch('/api-call-2'),
      fetch('/api-call-3'),
    ];
    // Imagine some of these requests fail, and some succeed.
    
    const resultFilter = (result, error) => result.filter(i => i.status === (!error ? 'fulfilled' : 'rejected')).map(i => (!error ? i.value : i.reason));
    
    const result = await Promise.allSettled(promises);
    
    const fulfilled = resultFilter(result); // all fulfilled results
    const rejected = resultFilter(result, true); // all rejected results
    
    27.04.2021

    13

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

    function promiseNoReallyAll (promises) {
      return new Promise(
        async (resolve, reject) => {
          const failedPromises = []
    
          const successfulPromises = await Promise.all(
            promises.map(
              promise => promise.catch(error => {
                failedPromises.push(error)
              })
            )
          )
    
          if (failedPromises.length) {
            reject(failedPromises)
          } else {
            resolve(successfulPromises)
          }
        }
      )
    }
    
    30.04.2019

    14

    Вы всегда можете обернуть свое обещание, возвращающее функции, таким образом, чтобы они перехватывали сбой и вместо этого возвращали согласованное значение (например, error.message), чтобы исключение не перекатывалось на функцию Promise.all и отключало ее.

    async function resetCache(ip) {
    
        try {
    
            const response = await axios.get(`http://${ip}/resetcache`);
            return response;
    
        }catch (e) {
    
            return {status: 'failure', reason: 'e.message'};
        }
    
    }
    
    15.07.2019

    15

    Я нашел способ (обходной путь) сделать это без синхронизации.

    Итак, как было упомянуто ранее, Promise.all - это вообще ничего.

    так что ... Используйте заключительное обещание, чтобы поймать и заставить разрешить.

    
          let safePromises = originalPrmises.map((imageObject) => {
                return new Promise((resolve) => {
                  // Do something error friendly
                  promise.then(_res => resolve(res)).catch(_err => resolve(err))
                })
            })
        })
    
        // safe
        return Promise.all(safePromises)
    
    17.11.2019

    16

    Вам нужно будет знать, как определить ошибку в ваших результатах. Если у вас нет стандартной ожидаемой ошибки, я предлагаю вам выполнить преобразование для каждой ошибки в блоке catch, чтобы ее можно было идентифицировать в ваших результатах.

    try {
      let resArray = await Promise.all(
        state.routes.map(route => route.handler.promiseHandler().catch(e => e))
      );
    
      // in catch(e => e) you can transform your error to a type or object
      // that makes it easier for you to identify whats an error in resArray
      // e.g. if you expect your err objects to have e.type, you can filter
      // all errors in the array eg
      // let errResponse = resArray.filter(d => d && d.type === '<expected type>')
      // let notNullResponse = resArray.filter(d => d)
    
      } catch (err) {
        // code related errors
      }
    
    19.11.2019

    17

    Не лучший способ вести журнал ошибок, но вы всегда можете установить все в массив для обещанияAll и сохранить полученные результаты в новых переменных.

    Если вы используете graphQL, вам необходимо постобработать ответ независимо, и если он не найдет правильную ссылку, это приведет к сбою приложения, сужая место проблемы.

    const results = await Promise.all([
      this.props.client.query({
        query: GET_SPECIAL_DATES,
      }),
      this.props.client.query({
        query: GET_SPECIAL_DATE_TYPES,
      }),
      this.props.client.query({
        query: GET_ORDER_DATES,
      }),
    ]).catch(e=>console.log(e,"error"));
    const specialDates = results[0].data.specialDates;
    const specialDateTypes = results[1].data.specialDateTypes;
    const orderDates = results[2].data.orders;
    
    10.12.2019

    18

    Вот как работает Promise.all. Если одно обещание reject(), весь метод немедленно терпит неудачу.

    Есть варианты использования, в которых может потребоваться Promise.all, допускающий сбой обещаний. Чтобы это произошло, просто не используйте в своем обещании никаких reject() операторов. Однако, чтобы гарантировать, что ваше приложение / скрипт не зависнет в случае, если какое-либо одно базовое обещание никогда не получит ответа, вам необходимо установить для него тайм-аут.

    function getThing(uid,branch){
        return new Promise(function (resolve, reject) {
            xhr.get().then(function(res) {
                if (res) {
                    resolve(res);
                } 
                else {
                    resolve(null);
                }
                setTimeout(function(){reject('timeout')},10000)
            }).catch(function(error) {
                resolve(null);
            });
        });
    }
    
    10.06.2018
  • вот ответ: stackoverflow.com/questions/31424561/ 14.08.2018
  • Не использовать reject() в вашем обещании - это нормально, но что, если вам нужно использовать обещания другой библиотеки? 04.02.2019

  • 19

    Я написал библиотеку npm, чтобы решить эту проблему красивее. https://github.com/wenshin/promiseallend

    Установить

    npm i --save promiseallend
    

    2017-02-25 новый api, это не нарушает принципы обещания

    const promiseAllEnd = require('promiseallend');
    
    const promises = [Promise.resolve(1), Promise.reject('error'), Promise.resolve(2)];
    const promisesObj = {k1: Promise.resolve(1), k2: Promise.reject('error'), k3: Promise.resolve(2)};
    
    // input promises with array
    promiseAllEnd(promises, {
        unhandledRejection(error, index) {
            // error is the original error which is 'error'.
            // index is the index of array, it's a number.
            console.log(error, index);
        }
    })
        // will call, data is `[1, undefined, 2]`
        .then(data => console.log(data))
        // won't call
        .catch(error => console.log(error.detail))
    
    // input promises with object
    promiseAllEnd(promisesObj, {
        unhandledRejection(error, prop) {
            // error is the original error.
            // key is the property of object.
            console.log(error, prop);
        }
    })
        // will call, data is `{k1: 1, k3: 2}`
        .then(data => console.log(data))
        // won't call
        .catch(error => console.log(error.detail))
    
    // the same to `Promise.all`
    promiseAllEnd(promises, {requireConfig: true})
        // will call, `error.detail` is 'error', `error.key` is number 1.
        .catch(error => console.log(error.detail))
    
    // requireConfig is Array
    promiseAllEnd(promises, {requireConfig: [false, true, false]})
        // won't call
        .then(data => console.log(data))
        // will call, `error.detail` is 'error', `error.key` is number 1.
        .catch(error => console.log(error.detail))
    
    // requireConfig is Array
    promiseAllEnd(promises, {requireConfig: [true, false, false]})
        // will call, data is `[1, undefined, 2]`.
        .then(data => console.log(data))
        // won't call
        .catch(error => console.log(error.detail))
    

    ————————————————————————————————

    Старый плохой api, не используйте его!

    let promiseAllEnd = require('promiseallend');
    
    // input promises with array
    promiseAllEnd([Promise.resolve(1), Promise.reject('error'), Promise.resolve(2)])
        .then(data => console.log(data)) // [1, undefined, 2]
        .catch(error => console.log(error.errorsByKey)) // {1: 'error'}
    
    // input promises with object
    promiseAllEnd({k1: Promise.resolve(1), k2: Promise.reject('error'), k3: Promise.resolve(2)})
        .then(data => console.log(data)) // {k1: 1, k3: 2}
        .catch(error => console.log(error.errorsByKey)) // {k2: 'error'}
    
    15.05.2016
  • Как это работает? Пожалуйста, покажите и объясните вашу реализацию функции. 16.05.2016
  • Я написал новую параллельную логику вроде Promise.all. Но он будет собирать все данные и ошибки каждого обещания. также он поддерживает ввод объекта, это не точка. после сбора всех данных и ошибок я переопределяю метод promise.then, чтобы иметь дело с зарегистрированными обратными вызовами, которые включают отклоненные и выполненные. Подробнее см. код. 17.05.2016
  • Этот код вызовет оба обработчика onFulfilled и onRejected, которые передаются в then? 17.05.2016
  • Да, только тогда, когда состояние обещания совпадает с fulfilled и rejected. Но на самом деле это создает серьезную проблему, чтобы быть совместимым со всеми вариантами использования обещаний, например, onFulfilled и onRejected, все возвращают Promise.reject() или Promise.resolve(). Пока я не понимаю, как это решить, есть ли у кого-нибудь идеи получше? Лучшим ответом на данный момент является то, что он может не фильтровать данные и ошибки в среде браузера. 17.05.2016
  • Нужно ли нам устанавливать модуль npm с диспетчером пакетов pip python? 08.03.2017
  • Извините, я сделал орфографическую ошибку, здесь не нужен pip, просто npm i --save promiseallend 21.03.2017
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..