如何映射异步函数的值

时间:2020-07-26 12:58:44

标签: javascript arrays asynchronous

getUserInfo-接收所有用户数组并将其传递给回调函数的函数。 getUsersIds-返回用户ID的数组(异步函数) getUserInfo-返回给定标识符的用户数据(异步功能)

该函数必须调用第一个参数传递的回调,并在其中传递用户数据数组。

结果数组中用户的顺序必须与getUsersIds中数组中ID的顺序匹配

const { getUserInfo, getUsersIds } = db;

function getUsersInfo(onLoad) {
    let res = [];
    getUsersIds(ids => {
        ids.forEach((id, index) => {
            getUserInfo((id, value) => {
                res[index] = value;
                console.log(value);
                if(ids.length === res.length){
                    onLoad(res);
                }
            })
        })
    })
}

数据与索引不匹配。怎么做呢?

1 个答案:

答案 0 :(得分:1)

您将立即触发所有getUserInfo调用,并在这些调用解析时填充res数组,这不会以相同的顺序进行。您可以使用Promise.all()Promise.allSettled()等待所有文件分别解析或解析/拒绝,然后返回结果。

您可以使用

function getUsersInfo() {
    return getUsersIds().then(ids => Promise.all(ids.map(getUserInfo)))     
    }

...或使用async/await

async function getUsersInfo() {
    let ids = await getUsersIds();
    let infos = await Promise.all(ids.map(getUserInfo));
    return infos
    }

...然后像这样调用onLoad函数

getUsersInfo().then(onLoad);