Javascript 节点承诺和返回值

Javascript 节点承诺和返回值,javascript,asynchronous,promise,blocking,Javascript,Asynchronous,Promise,Blocking,我一直在努力加强对JavaScript承诺和异步性的理解。我知道下面的示例将无法按预期工作,“someStuff”将返回一个空数组。我还相信我理解这是因为“doPromise”不阻塞,所以循环在“doPromise”解析之前完成并返回一个空数组 我不明白的是,如何以适当的方式实现本例中所述的相同功能 我想我的问题是:做这件事的“正确”方法是什么?提前谢谢 function doPromise(number){ return new Promise((resolve,reject)=>

我一直在努力加强对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());
功能多普勒(数字){
返回新承诺((解决、拒绝)=>{
解析(数字+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()
处理程序将把
未定义的
值推送到数组中。这真的是您想要的吗?