节点承诺和返回值

Node Promises and returning values

我一直在努力加深对 JavaScript 的承诺和异步性的理解。我知道下面的示例不会按预期工作,并且 "someStuff" 将 return 一个空数组。我也相信我明白这是因为 "doPromise" 不会阻塞,所以循环完成并且 return 在 "doPromise" 解析之前是一个空数组。

我不明白的是如何以适当的方式完成此示例中表达的相同功能。

我想我的问题是:"right" 的方法是什么?提前致谢!

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());

"doPromise" does not block, so the loop completes and returns an empty array before any "doPromise()" has ever resolved.

是的。这也意味着你 不能 return 同步结果数组,你只能在所有承诺都解决后才能获取值。所以你的 someStuff 函数也是异步的,所以它应该 return 一个承诺(对于结果数组)。

要从一组承诺中获得一组结果的承诺,您可以使用 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);
});

你可以使用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);
});

您应该注意,从异步函数返回而不在异步函数调用上使用 .then 只会显示未解决的承诺(待处理)。为了能够在不使用 .then 的情况下做到这一点,您必须等待几个月,直到 TC39 标准化顶层 await