如何解决NodeJS:保证异步功能的顺序
如何确保在第一个函数执行完后启动第二个函数调用?
const asyncFuntion = async (callNumber: string,timeout: number) => {
await setTimeout(() => {
console.log(`call: ${callNumber}`,timeout);
},timeout);
};
asyncFuntion("1",100);
asyncFuntion("2",50);
现在控制台输出:
call: 2 50
call: 1 100
所需的控制台输出:
call: 1 100
call: 2 50
解决方法
await
对setTimeout()
无效,因为它不会返回承诺。
因此,解决此问题的方法是使用setTimeout
包装Promise
。
此外,如果您希望在第二个函数之前执行第一个函数调用,请在对第二个函数进行调用之前创建承诺并解决它们,并在第一个函数调用中使用await
。
看看以下实现:
const asyncFuntion = async (callNumber,timeout) => {
return new Promise( async (resolve,reject) => {
await setTimeout(() => {
console.log(`call: ${callNumber}`,timeout);
resolve();
},timeout);
});
};
async function test() {
/*Write the function calls in the order you want them to get executed*/
await asyncFuntion("1",100);
await asyncFuntion("2",50);
}
test();
PS:您还应该等待第二个调用,以便test()返回的promise在适当的时间实现,而不是在运行两个超时的中间。 致谢@Bergi。
,需要注意的两件事。
-
在
await
前面使用setTimeout
无效。它仅适用于返回承诺的函数。 -
setTimeout
的执行顺序仅取决于间隔,而不取决于其他迭代。
间隔50毫秒之前没有办法间隔100毫秒。如果您希望第二个呼叫一直等到第一个呼叫完成,请创建一个诺言并解决它,然后再呼叫第二个呼叫。
,另一种操作setTimeout定时器的方法,它不那么复杂,但可以工作。
let timer = 0
const asyncFuntion = (callNumber,timeout) => {
timer += timeout
setTimeout(() => {
console.log(`call: ${callNumber}`,timeout);
},timer);
};
asyncFuntion("1",100);
asyncFuntion("2",50);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。