节点承诺和返回值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了节点承诺和返回值相关的知识,希望对你有一定的参考价值。

我一直在努力加强对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());
答案

“doPromise”不会阻塞,因此循环完成并在任何“doPromise()”解析之前返回一个空数组。

是。这也意味着您无法同步返回结果数组,只能在所有promise已解决后获取值。所以你的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);
});
另一答案

你可以使用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标准化为止等待

以上是关于节点承诺和返回值的主要内容,如果未能解决你的问题,请参考以下文章

异步函数返回承诺,而不是值

异步函数返回承诺,而不是值

.sink 没有从 Future Publisher 返回承诺值

从承诺返回 then()

Javascript - 异步等待和获取 - 返回值,而不是承诺?

承诺回调返回承诺