我是JS新手,我正在Node.js中为我的应用程序编写一些简单的REST API。 我想在代码中的某个地方等待大约5秒钟。
我对Promise和常规超时方法的使用感到困惑,并在其他地方调用了该函数。如下:
const sleep = (time) => {
return new Promise(resolve => {
setTimeout(() => {
resolve()
console.log('5 seconds');
}, time);
})
}
然后调用函数:
sleep(5000)
OR
const sleep = (time) => {
return new Promise(resolve => {
setTimeout(() => {
resolve()
console.log('5 seconds');
}, time);
})
}
然后调用函数:
sleep(5000).then(() => console.log('5 seconds passed'))
OR
const sleep = (time) => {
return new Promise(resolve => {
setTimeout(() => {
resolve()
console.log('5 seconds');
}, time);
})
}
async function wait(sleepTime) {
await sleep(sleepTime)
}
然后调用函数:
wait(5000)
我做错什么了吗?因为在所有3种情况下,我实际上都得到5秒的等待时间,但是由于该函数返回Promise,因此如果要使用Promise,则必须使用.then()
。
答案 0 :(得分:0)
然后,当您要获取Promise的结果时,即使没有使用Promise的结果,promise的代码仍然可以工作
答案 1 :(得分:0)
更新:
在情况3中,您可以await
和async
函数。
(async () => {
await wait(5000);
// Do something after 5 sec
})();
您的代码没有错。 所以我不确定你是什么问题。
无论如何,您可以通过以下方式了解Promise
:
new Promise(resolve => {
setTimeout(() => {
resolve();
}, 5000);
}).then(() => {
// Do something after 5 sec
});
等同于
setTimeout(() => {
// Do something after 5 sec
}, 5000);
答案 2 :(得分:0)
第一种情况。
1。与doSomething()
一样的异步执行不等待sleep
函数完成执行。
2。该承诺将保持待定状态。
sleep(5000);
doSomething();// execution starts without waiting for 5 seconds.
第二种情况:
1.Promise被解决,then()/catch()
侦听器被调用。
2.在doSomething()
完成执行之后,使sleep()
执行。
sleep(5000).then(() => {doSomething();// execution starts after waiting for 5 seconds. })
第三种情况:
1.异步函数返回一个Promise。
2.等待/然后-以相同的方式工作(解决/拒绝承诺并返回数据/错误)。
3.等待只能在异步功能内使用。
我建议您仅创建一个异步函数,其中包含api的业务逻辑。
async function wait(sleepTime) {
// some code
await sleep(sleepTime); // waiting
doSomething(); // execution starts only after waiting.
// some other code
}
在没有wait
的情况下呼叫then
会产生未完成的承诺,但这不会影响您的业务逻辑。
// sample example.
wait(5000).then(()=>{res.send("ok");}).catch(e=>{res.send("err")});