我正在尝试创建一个Promises数组,该数组在完成时会向控制台打印一条消息。但是,即使数组中有10个promise对象,它似乎也只能打印一次。
我已经尝试过ES6 Promises/calling a function after multiple promises are fulfilled (can't use Promises.all)中的解决方案 但它仍然不起作用。
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次“已发送一个对象”,但是只打印到控制台一次,之后可以无限期地继续运行。
这是错误日志: 正在运行测试脚本... 发送一个对象 提交了一份要求 [object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise] < / p>
答案 0 :(得分:3)
由于sendStuffB
仅是一个承诺,因此只能解决一次。数组中的所有其他项目均引用相同的已解决承诺。
相反,在fillArrayWithPromise
函数中,传递一个返回promise的函数,并为每个数组项分别调用该函数。
此外,请始终记住根据需要在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");
});
答案 1 :(得分:0)
您没有在promise中调用resolve函数,因此它们从未完成。尝试这样做:
var sendStuffB = new Promise(
function(resolve, reject) {
try {
console.log("submitted one req");
resolve();
} catch (error) {
console.log("Error: " + error);
reject(error);
}
}
)
答案 2 :(得分:0)
这是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));