ES6 Promises.all() 不全部执行(promises 中没有捕获到错误)
ES6 Promises.all() does not execute all (no error caught in promises)
我正在尝试创建一个 Promise 数组,它会在实现时向控制台打印一条消息。但是,即使数组中有 10 个 promise 对象,它似乎也只打印一次。
我已经尝试过 中的解决方案
但它仍然不起作用。
function fillArrayWithPromise(promise, numTimes) {
let promiseArr = Array(numTimes).fill(promise);
console.log(promiseArr.join("-"));
return promiseArr
}
var sendStuffB = new Promise(
function(resolve, reject) {
try {
console.log("submitted one req");
} catch (error) {
console.log("Error: " + error);
}
}
)
let testA = fillArrayWithPromise(sendStuffB, 10);
Promise.all(
testA.map(promise => Promise.resolve(promise).catch(err => console.log(error)))
).then(function() {
console.log("End");
});
我希望控制台打印 10 次 "One object sent",但它只打印到控制台一次,然后无限期地继续 运行。
这是错误日志:
运行 测试脚本...
已发送一个对象
提交了一个请求
[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]
您没有在 promise 中调用 resolve 函数,因此它们永远不会完成。尝试这样做:
var sendStuffB = new Promise(
function(resolve, reject) {
try {
console.log("submitted one req");
resolve();
} catch (error) {
console.log("Error: " + error);
reject(error);
}
}
)
因为sendStuffB
只有一个promise,所以只resolve一次。数组中的所有其他项目都引用同一个已解决的承诺。
取而代之的是,在 fillArrayWithPromise
函数中,传递一个 returns 承诺的函数,并为每个数组项分别调用该函数。
此外,永远记得根据需要在 promise 构造函数中解析或拒绝 promise。
function fillArrayWithPromise(promiseFn, numTimes) {
let promiseArr = Array(numTimes).fill(promiseFn).map(fn => fn()); //see this
return promiseArr
}
var sendStuffB = () => new Promise( // converted to function
function(resolve, reject) {
try {
console.log("submitted one req");
resolve(); // remember to resolve
} catch (error) {
console.log("Error: " + error);
reject(error); // reject
}
}
)
let testA = fillArrayWithPromise(sendStuffB, 10);
Promise.all(
testA.map(promise => Promise.resolve(promise).catch(err => console.log(error)))
).then(function() {
console.log("End");
});
这是 Promise.all 功能的一个基本示例。
可能对你有帮助。
const delayArray = [1000,1500,2000];
const promises = delayArray.map((item) => {
return new Promise((resolve,reject) => {
setTimeout(()=>{
console.log('I was resolved in' + item + 'ms');
resolve('Resolved' + item + 'ms');
},item);
});
});
Promise.all(promises)
.then((values) => console.log(values));
我正在尝试创建一个 Promise 数组,它会在实现时向控制台打印一条消息。但是,即使数组中有 10 个 promise 对象,它似乎也只打印一次。
我已经尝试过
function fillArrayWithPromise(promise, numTimes) {
let promiseArr = Array(numTimes).fill(promise);
console.log(promiseArr.join("-"));
return promiseArr
}
var sendStuffB = new Promise(
function(resolve, reject) {
try {
console.log("submitted one req");
} catch (error) {
console.log("Error: " + error);
}
}
)
let testA = fillArrayWithPromise(sendStuffB, 10);
Promise.all(
testA.map(promise => Promise.resolve(promise).catch(err => console.log(error)))
).then(function() {
console.log("End");
});
我希望控制台打印 10 次 "One object sent",但它只打印到控制台一次,然后无限期地继续 运行。
这是错误日志: 运行 测试脚本... 已发送一个对象 提交了一个请求 [对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]-[对象承诺]
您没有在 promise 中调用 resolve 函数,因此它们永远不会完成。尝试这样做:
var sendStuffB = new Promise(
function(resolve, reject) {
try {
console.log("submitted one req");
resolve();
} catch (error) {
console.log("Error: " + error);
reject(error);
}
}
)
因为sendStuffB
只有一个promise,所以只resolve一次。数组中的所有其他项目都引用同一个已解决的承诺。
取而代之的是,在 fillArrayWithPromise
函数中,传递一个 returns 承诺的函数,并为每个数组项分别调用该函数。
此外,永远记得根据需要在 promise 构造函数中解析或拒绝 promise。
function fillArrayWithPromise(promiseFn, numTimes) {
let promiseArr = Array(numTimes).fill(promiseFn).map(fn => fn()); //see this
return promiseArr
}
var sendStuffB = () => new Promise( // converted to function
function(resolve, reject) {
try {
console.log("submitted one req");
resolve(); // remember to resolve
} catch (error) {
console.log("Error: " + error);
reject(error); // reject
}
}
)
let testA = fillArrayWithPromise(sendStuffB, 10);
Promise.all(
testA.map(promise => Promise.resolve(promise).catch(err => console.log(error)))
).then(function() {
console.log("End");
});
这是 Promise.all 功能的一个基本示例。
可能对你有帮助。
const delayArray = [1000,1500,2000];
const promises = delayArray.map((item) => {
return new Promise((resolve,reject) => {
setTimeout(()=>{
console.log('I was resolved in' + item + 'ms');
resolve('Resolved' + item + 'ms');
},item);
});
});
Promise.all(promises)
.then((values) => console.log(values));