我有两个简单的异步函数: 首先:
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
来获得我想要的东西?预先谢谢你!
答案 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
。