在Node js中使用setTimout()作为Promise

时间:2019-10-12 16:37:53

标签: javascript node.js callback es6-promise

我是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()

3 个答案:

答案 0 :(得分:0)

然后,当您要获取Promise的结果时,即使没有使用Promise的结果,promise的代码仍然可以工作

答案 1 :(得分:0)

更新: 在情况3中,您可以awaitasync函数。

(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")});