我一直在努力加强对JavaScript的承诺和异步性的理解。我知道下面的示例将无法正常工作,“someStuff”将返回一个空数组。我也相信我明白这是因为“doPromise”没有阻塞,所以循环完成并在“doPromise”解决之前返回一个空数组。
我不明白的是我如何以适当的方式完成此示例中表达的相同功能。
我想我的问题是:这样做的“正确”方法是什么?提前谢谢!
function doPromise(number){
return new Promise((resolve,reject)=>{
resolve(number + 10);
});
}
function someStuff(){
var values = [];
for(var i = 0; i < 10;i++){
doPromise(i).then((sum)=>{
values.push(sum);
});
}
return values;
}
console.log(someStuff());
答案 0 :(得分:1)
&#34; doPromise&#34;不会阻塞,所以循环完成并在任何&#34; doPromise()&#34;之前返回一个空数组。已经解决了。
是。这也意味着不能同步返回结果数组,只能在所有promises解析后获取值。所以你的someStuff
函数也是异步的,所以它应该返回一个promise(对于结果数组)。
要获得承诺数组中的结果数组的承诺,您可以使用Promise.all
函数。
function someStuff() {
var promises = [];
for (var i=0; i<10; i++) {
promises.push(doPromise(i));
}
return Promise.all(promises);
}
someStuff().then(values => {
console.log(values);
});
答案 1 :(得分:0)
您可以使用async await
function doPromise(number) {
return new Promise(( resolve, reject) => {
resolve(number + 10);
});
}
async function someStuff() {
var values = [];
for ( var i = 0 ; i < 10 ; i++ ) {
const sum = await doPromise(i).catch(ex => console.log("error: ", ex));
values.push(sum);
}
return values;
}
someStuff().then( val => {
console.log(val);
});
您应该注意,在async函数调用中不使用.then
从async函数返回时只显示未解析的promise(pending)。为了能够在不使用.then
的情况下执行此操作,您必须等待几个月,直到TC39
标准化为等待