Promise.all不等待所有承诺得到解决。在下面的代码中,我试图复制一个场景,根据一些服务(两个服务)响应我将设置数组然后当所有服务调用完成,process.all将给出受限值。但是这不起作用。
index.js
它应该打印"全部完成[1000,3000]"但是它打印了#34;全部完成[]"
请帮忙。
答案 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);
});