Javascript 节点承诺和返回值
我一直在努力加强对JavaScript承诺和异步性的理解。我知道下面的示例将无法按预期工作,“someStuff”将返回一个空数组。我还相信我理解这是因为“doPromise”不阻塞,所以循环在“doPromise”解析之前完成并返回一个空数组 我不明白的是,如何以适当的方式实现本例中所述的相同功能 我想我的问题是:做这件事的“正确”方法是什么?提前谢谢Javascript 节点承诺和返回值,javascript,asynchronous,promise,blocking,Javascript,Asynchronous,Promise,Blocking,我一直在努力加强对JavaScript承诺和异步性的理解。我知道下面的示例将无法按预期工作,“someStuff”将返回一个空数组。我还相信我理解这是因为“doPromise”不阻塞,所以循环在“doPromise”解析之前完成并返回一个空数组 我不明白的是,如何以适当的方式实现本例中所述的相同功能 我想我的问题是:做这件事的“正确”方法是什么?提前谢谢 function doPromise(number){ return new Promise((resolve,reject)=>
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());
功能多普勒(数字){
返回新承诺((解决、拒绝)=>{
解析(数字+10);
});
}
函数something(){
var值=[];
对于(变量i=0;i<10;i++){
doPromise(i)。然后((总和)=>{
值。推(和);
});
}
返回值;
}
log(someStuff());
“doPromise”不会阻塞,因此在解析任何“doPromise()”之前,循环完成并返回一个空数组
对。这也意味着您无法同步返回结果数组,只能在所有承诺都已解决后才能获取值。因此,您的someStuff
函数也是异步的,因此它应该返回一个承诺(对于结果数组)
要从承诺数组中获取结果数组的承诺,可以使用函数
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);
});
函数something(){
var承诺=[];
对于(var i=0;i{
console.log(值);
});
您可以使用异步等待
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);
});
功能多普勒(数字){
返回新承诺((解决、拒绝)=>{
解析(数字+10);
});
}
异步函数someStuff(){
var值=[];
对于(变量i=0;i<10;i++){
const sum=await doPromise(i.catch)(ex=>console.log(“error:,ex));
值。推(和);
}
返回值;
}
someStuff()。然后(val=>{
控制台日志(val);
});
您应该注意,从异步函数返回时不使用
。然后在异步函数调用上使用,只显示未解析的承诺(挂起)。要做到这一点,无需使用。然后
您必须等待几个月,直到TC39
标准化顶级等待,因为某些东西
使用承诺,它无法同步返回结果。您需要返回一个承诺,一旦所有承诺都得到解决……这就是承诺适用于…值。在循环中推送(doPromise(i))
,并返回承诺。所有(值)
-当然,您还必须更改调用代码…sometuff()。然后(result=>console.log(result))
-或者只是sometuff()。然后(console.log)
不要使用number
作为参数/变量名。它在JS中是一个保留字。您的.catch()
处理程序将把未定义的值推送到数组中。这真的是您想要的吗?