javascript - 节点 promise 和返回值

标签 javascript asynchronous promise blocking

我一直在努力加深对 JavaScript 的 promise 和异步性的理解。我知道下面的示例不会按预期工作,“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" does not block, so the loop completes and returns an empty array before any "doPromise()" has ever resolved.

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

要从一组 promise 中获得一组结果的 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);
});

关于javascript - 节点 promise 和返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49544725/

相关文章:

javascript - ASPX 页面上的 C# 值在刷新时合并

java - 在气球内显示带有照片的多个地标的最佳做法是什么?

servlets - Async Servlet - 首选实现

java - 单线程异步处理

c# - 有 "single-item-sized async task buffer"这样的同步工具吗?

javascript - 是否存在模仿 should.throws 的 shouldjs 函数?

angular - 在 Angular 的 http 订阅操作中使用 ngx-spinner

javascript - Ionic Windows 应用程序崩溃模拟器

javascript - 在 JavaScript 函数中执行 Firestore 查询

javascript - svg/snapsvg 创建弯曲的文本