如何将数组与异步/等待一起使用?

mat*_*ish 1 javascript

如果测试是异步的并且可能抛出错误,如何检查每个元素是否通过测试

const exists = async () => {//can throw an error}
const allExists = [12, 5, 8, 130, 44].every(exists);
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

您不能像使用every异步工作的函数那样使用同步方法,因为同步方法不会等待异步结果。async every不过,可以写一个:

async function every(array, callback) {
    for (const element of array) {
        const result = await callback(element);
        if (!result) {
           return false;
        }
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

请注意,由于它依赖于异步信息,因此它也异步传递结果。你必须await这样做(或使用.then/.catch等)。

该版本按系列工作,仅当第一个条目的回调完成其工作时才调用第二个条目的回调。这可以让您短路(当您已经知道答案时,不会调用后面条目的回调),但可能会导致总体时间更长。另一种方法是并行执行所有调用,然后检查它们的结果:

Promise.all(array.map(callback))
.then(flags => flags.every(Boolean))
.then(result => {
    // ...`result` will be `true` or `false`...
});
Run Code Online (Sandbox Code Playgroud)