используя setTimout () в качестве Promise в узле js - PullRequest
0 голосов
/ 12 октября 2019

Я новичок в JS и пишу несколько простых REST API в Node.js для моего приложения. Где-то внутри кода я хочу подождать около 5 секунд.

Я так запутался в использовании Promise и обычного метода тайм-аута и вызова функции где-то еще. следующим образом:

const sleep = (time) => {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve()
            console.log('5 seconds');
        }, time);
    })
}

и затем вызвать функцию:

sleep(5000)

ИЛИ

const sleep = (time) => {
    return new Promise(resolve => {
        setTimeout(() => {
           resolve()
           console.log('5 seconds');
       }, time);
    })
}

, а затем вызвать функцию:

sleep(5000).then(() => console.log('5 seconds passed'))

ИЛИ

const sleep = (time) => {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve()
            console.log('5 seconds');
        }, time);
    })
}

async function wait(sleepTime) {
    await sleep(sleepTime)
}

и затем вызвать функцию:

wait(5000)

Я что-то не так делаю? Потому что во всех трех случаях я на самом деле получаю время ожидания 5 секунд, но поскольку функция возвращает Promise, я должен использовать .then(), если я хочу использовать Promise.

Ответы [ 3 ]

0 голосов
/ 12 октября 2019

Обновление : В случае 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);
0 голосов
/ 12 октября 2019

Первый случай.
1. Asynchronous Execution as doSomething() не ожидает, пока функция sleep не завершит выполнение.
2. Обещание останется в состоянии ожидания.

sleep(5000); 
doSomething();// execution starts without waiting for 5 seconds.

Второй случай:
1. Обещание разрешено, вызывается прослушиватель then()/catch().
2. Выполнение doSomething() после того, как sleep() завершит его выполнение.

sleep(5000).then(() => {doSomething();// execution starts after waiting for 5 seconds. })

Третий случай:
1. Асинхронная функция возвращает обещание.
2. Await / then - работает аналогично (разрешает / отклоняет обещание и возвращает данные / ошибку).
3. Await может использоваться только внутри асинхронной функции.

Я бы предложил вам создать только одну асинхронную функцию, которая содержит бизнес-логику для 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")});
0 голосов
/ 12 октября 2019

затем вы используете, когда хотите получить результат обещания, код обещания будет работать в любом случае, даже не используя его результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...