【问题标题】:Async Await does not work as expected [duplicate]异步等待没有按预期工作[重复]
【发布时间】:2018-05-05 12:47:01
【问题描述】:

目前我们将短字符串存储为键。

这些键对应于作为标签的长值。

我正在尝试更新键的相应长值。

但是 console.log(record) 总是先执行,然后执行内部日志语句,这是不希望的。它总是将未修改的记录发送给 getRadioValues 函数调用者。

我想在对应的key更新后返回记录。

export const getRadioValues = (record: IRecordInput) => {
    const singleSelectKeys = ['Race', 'DeathWas', 'MannerOfDeath'];
    singleSelectKeys.forEach(async key => {
        if (record[key]) {
            const dropDownOption = await DropDownOptions.find({ where: { id: record[key] }}) as IPDFSelect;
            record[key] = dropDownOption.dataValues.Text;
            console.log(record[key]);
        }
    });
    console.log(record);
    return record;
};

【问题讨论】:

    标签: javascript typescript ecmascript-6 async-await


    【解决方案1】:

    您的forEach 正在使用异步函数,这意味着循环可能在它创建的任何承诺之前完成。要解决此问题,您需要获得承诺的结果并等待它们。但是,这意味着封闭函数本身必须是异步的,这对于您的实际用例可能是可接受的,也可能是不可接受的。

    export const getRadioValues = async (record: IRecordInput) => {
        const singleSelectKeys = ['Race', 'DeathWas', 'MannerOfDeath'];
        await Promise.all(singleSelectKeys.map(async key => {
            if (record[key]) {
                const dropDownOption = await DropDownOptions.find({ where: { id: record[key] }}) as IPDFSelect;
                record[key] = dropDownOption.dataValues.Text;
                console.log(record[key]);
            }
        }));
        console.log(record);
        return record;
    };
    

    【讨论】:

    • which may or may not be acceptable for your actual use case. - 可接受性无关紧要。 getRadioValues 返回的结果是异步的,它必须用作异步函数(不一定是 async,但如果你返回一个 promise)
    • 最初我尝试使用与您建议的代码相同的代码,但 Promise.all 函数除外。 async await 不会解决 Promise 本身吗?
    • 是的,在回调内部
    • @GauravShah 我不确定你的意思是什么? await Promise.all 确保所有承诺在移至下一行之前都已解决。你不能等待一个数组(你可以,但它什么也不做),所以Promise.all 绝对是其中的必要部分。不过我可能误解了,所以如果你能澄清一下,我会提供一个更好的答案。
    • @CRice:我认为我对 Async/Await 的理解并不清楚。 Await 等待 Promise 解决,然后执行下一条语句。我认为它 Await 解决了承诺本身,我们不必使用 Promise.all 或 Promise.resolve 语句。
    猜你喜欢
    • 2018-12-02
    • 2021-12-08
    • 2015-05-06
    • 2019-04-19
    • 2021-03-27
    • 2020-03-04
    • 2019-04-07
    • 2023-03-03
    • 2022-01-06
    相关资源
    最近更新 更多