为什么异步数组映射返回promises而不是value

时间:2017-11-29 16:10:14

标签: javascript promise async-await

请参阅以下代码

Array.prototype.mapAsync = async function(callback) {
    arr = [];
    for (var i = 0; i < this.length; i++)
        arr.push(await callback(this[i], i, this));
    return arr;
};

var arr = await [1,2,3,4,5].mapAsync(async (index) => { 
    return await new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(index);
            console.log(index);
        }, 1000);
    });
});
// outputs 1, 2 ,3 ... with 1 second intervals, 
// arr is [1,2,3,4,5] after 5 seconds.

快速修改:  接受的答案是正确的,说地图不会对异步函数做任何特殊处理。我不知道为什么我认为它识别异步fn并知道等待响应。

我或许期待这样的事情。

{{1}}

2 个答案:

答案 0 :(得分:4)

因为async函数总是返回一个承诺;并且map没有异步性的概念,也没有对承诺的特殊处理。

但您可以随时使用Promise.all

等待结果
try {
    const results = await Promise.all(arr);
    // Use `results`, which will be an array
} catch (e) {
    // Handle error
}

直播示例:

var arr = [1,2,3,4,5].map(async (index) => { 
    return await new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(index);
            console.log(index);
        }, 1000);
    });
});
(async() => {
    try {
        console.log(await Promise.all(arr));
        // Use `results`, which will be an array
    } catch (e) {
        // Handle error
    }
})();
.as-console-wrapper {
  max-height: 100% !important;
}

或使用Promise语法

Promise.all(arr)
    .then(results => {
        // Use `results`, which will be an array
    })
    .catch(err => {
        // Handle error
    });

直播示例:

var arr = [1,2,3,4,5].map(async (index) => { 
    return await new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(index);
            console.log(index);
        }, 1000);
    });
});
Promise.all(arr)
    .then(results => {
        console.log(results);
    })
    .catch(err => {
        // Handle error
    });
.as-console-wrapper {
  max-height: 100% !important;
}

旁注:由于async函数总是返回promises,并且你在函数中唯一await是你创建的一个承诺,使用{{async函数是没有意义的。 1}}无论如何都在这里运作。只需返回您正在创建的承诺:

var arr = [1,2,3,4,5].map((index) => { 
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(index);
            console.log(index);
        }, 1000);
    });
});

当然,如果你真的在那里做了一些更有趣的事情,await在各种事情上(而不仅仅是new Promise(...)),那就不同了。 : - )

答案 1 :(得分:0)

由于它是异步的,因此在map返回时尚未确定值。在箭头功能运行之前它们不会存在。

这就是Promises存在的原因。它们是未来可以获得价值的承诺。