2017-02-20 77 views
2

我有几个承诺,我需要在继续之前解决。ES6 Promise.all progress

Promise.all(promises).then((results) => { 
    // going further 
}); 

有什么方法可以让我有Promise.all承诺的进展如何?

从文档看来,似乎是it is not possiblethis question也不回答。

所以:

  • 你不同意,这将是有益的?我们不应该查询这个功能吗?
  • 现在如何手动实现它?
+0

你总是可以有'promises'数组的长度和从每个承诺回调增量使用像'incrementCount()'这样的函数创建一个共享变量值,并且在同一个对象上创建一个像getPercent()这样的函数,当每个解析或拒绝发生时返回'counter * 100/promises.length'诺言。 – ishaan

+0

您可以在将Promise.all()推送到数组之前,通过为每个promise添加'.then()'来模拟promise.progress()。这有点额外的开销,但可以得心应手。 – Shilly

回答

4

我敲了一个小助手功能,你可以重新使用。

基本上通过你的承诺是正常的,并提供一个回调做你想要与进步的..

function allProgress(proms, progress_cb) { 
 
    let d = 0; 
 
    progress_cb(0); 
 
    proms.forEach((p) => { 
 
    p.then(()=> {  
 
     d ++; 
 
     progress_cb((d * 100)/proms.length); 
 
    }); 
 
    }); 
 
    return Promise.all(proms); 
 
} 
 

 
function test(ms) { 
 
    return new Promise((resolve) => { 
 
    setTimeout(() => { 
 
     console.log(`Waited ${ms}`); 
 
     resolve(); 
 
    }, ms); 
 
    }); 
 
} 
 

 

 
allProgress([test(1000), test(3000), test(2000), test(3500)], 
 
    (p) => { 
 
    console.log(`% Done = ${p.toFixed(2)}`); 
 
});

2

您可以在每个承诺中添加一个.then()来计算完成的whos。 类似:

var count = 0; 
 

 
var p1 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 5000, 'boo'); 
 
}); 
 
var p2 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 7000, 'yoo'); 
 
}); 
 
var p3 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 3000, 'foo'); 
 
}); 
 

 
var promiseArray = [ 
 
    p1.then(function(val) { 
 
    progress(++count); 
 
    return val 
 
    }), 
 
    p2.then(function(val) { 
 
    progress(++count); 
 
    return val 
 
    }), 
 
    p3.then(function(val) { 
 
    progress(++count); 
 
    return val 
 
    }) 
 
] 
 

 
function progress(count) { 
 
    console.log(count/promiseArray.length); 
 
} 
 

 
Promise.all(promiseArray).then(values => { 
 
    console.log(values); 
 
});