如何使用async / await进行一对一的异步调用?

时间:2018-12-28 19:38:18

标签: javascript async-await es6-promise

我有两个简单的异步函数: 首先:

const first = async () => {
    setTimeout(() => {
        console.log(1)
    },2000);
}

第二:

const second = async () => {
    console.log(2);
}

我正在尝试保留第二项功能,直到完成第一项。我的代码:

router.post('/', errorHandler(async (req, res) => {
    try {

        await first();
        await second();

    } catch (err) {
        console.log(err);
    }
})
);

但是第二个函数首先执行。我该如何使用await来获得我想要的东西?预先谢谢你!

1 个答案:

答案 0 :(得分:3)

问题在于它无法知道代码何时完成。如果将第一个功能更改为如下所示,则它应该可以工作。

const first = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(1);
            resolve();
        },2000);
    });
}

基本上,这是在返回超时后将解决的诺言。这样,您的await将等待直到调用resolve函数。

您还可以执行以下操作,将setTimeout转换为Promise。

const timeout = (ms) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => resolve(), ms);
    });
}

const first = async () => {
    await timeout(2000);
    console.log(1);
}

但是最大的问题是您正在尝试将回调和承诺(await)组合在一起。因此,在某个时候,您必须将该回调(setTimeout)转换为Promise,以便可以await