Promise.all并没有等待所有承诺得到解决

时间:2018-01-16 16:58:35

标签: javascript angular asynchronous promise

Promise.all不等待所有承诺得到解决。在下面的代码中,我试图复制一个场景,根据一些服务(两个服务)响应我将设置数组然后当所有服务调用完成,process.all将给出受限值。但是这不起作用。

index.js

它应该打印"全部完成[1000,3000]"但是它打印了#34;全部完成[]"

请帮忙。

2 个答案:

答案 0 :(得分:6)

这是因为您在超时后创建了promises。你需要在Promise中包装超时

let errorPromises = [];

errorPromises.push(new Promise((resolve, reject) => {
  setTimeout(() => resolve(1000), 2000);
}));

// or a one-liner
// errorPromises.push(new Promise(resolve => setTimeout(() => resolve(1000), 2000)));

/// repeat with all others...

let promise = Promise.all(errorPromises);
promise.then(data => {
  console.log("All done", data);
});

答案 1 :(得分:0)

这是因为您在错误承诺在数组中之前创建了promise。承诺在超时中被推送到数组中需要1秒和2秒,所以如果等待数组包含某些东西,你得到你想要的东西,例如,如果你也为promise设置了超时,这应该发生在承诺被推入阵列。

let errorPromises = [];
    setTimeout(() => {
      errorPromises.push(new Promise((resolve, reject) => resolve(1000)));
    }, 2000);
    setTimeout(() => {
      errorPromises.push(new Promise((resolve, reject) => resolve(3000)));
    }, 1000);

    setTimeout(() => {
        let promise = Promise.all(errorPromises);
        promise.then(data => {
          console.log("All done", data);
        });
    }, 3000);

所以基本上你会立即触发控制台日志,然后由于超时你的阵列仍然是空的。

 let errorPromises = [];
 errorPromises.push(new Promise((resolve, reject) => resolve(1000)));
 errorPromises.push(new Promise((resolve, reject) => resolve(3000)));

 let promise = Promise.all(errorPromises);
 promise.then(data => {
  console.log("All done", data);
 });