Реализация многословной функции сна с использованием цепочки обещаний - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь реализовать функцию сна, используя Promises в JavaScript.

function sleep(ms) {

  var begin = new Promise(resolve => {
    console.log("Sleep function called for " + ms + " ms\n")
  });

  return new Promise(resolve => setTimeout(resolve, ms))
    .then(() => console.log("Sleep done!" ));

}

и все работает.Но

function sleep(ms) {

  var begin = new Promise(resolve => {
    console.log("Sleep function called for " + ms + " ms\n")
  });

  return begin.then(resolve => setTimeout(resolve, ms))
    .then(() => console.log("Sleep done!" ));

}

нет, скорее просто зависает!Что дает?

ОБНОВЛЕНИЕ : То, что я действительно хочу сделать, это записать это как последовательность вызовов обещания.

function sleep(ms) { 
    var beginAnnounce = new Promise(...);
    var goSleep = new Promise (...);
    var endAnnounce = new Promise...);

    return beginAnnounce.then(goSleep).then(endAnnounce());

}

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Если вы хотите составить два обещания, вы можете вернуть второе в обратном вызове, переданном Promise.prototype.then первого обещания.

Посмотрите на следующий код:

const sleep = ms => () => new Promise((resolve, reject) => window.setTimeout(resolve, ms));

Promise.resolve()
.then(() => { console.log('A1');})
.then(sleep(2000))
.then(() => {console.log('A2');});

Promise.resolve()
.then(() => {console.log('B1');})
.then(sleep(1000))
.then(() => {console.log('B2');});

Функция sleep является функцией более высокого порядка, которая возвращает другую функцию, которая возвращает обещание.Это обещание разрешается в вызове Window.setTimeout, параметризованном ms, переданном sleep.

Как вы можете видеть, выполнение выполняется с чередованием, и вы увидите выходные данные журнала для оператора console.log('B2')второго обещания перед выходом для console.log('A2'); первого.

0 голосов
/ 01 января 2019

Во втором фрагменте вам нужно разрешить begin немедленно

var begin = new Promise(resolve => {
  console.log("Sleep function called for " + ms + " ms\n")
  resolve()
})

Причина, по которой он работает в первом фрагменте, заключается в том, что вы никогда не полагаетесь на begin до конца, у вас его просто естьвойти начало.Но это не так, как вы хотите это сделать.Нет смысла иметь Обещание, которое разрешается немедленно (в любом случае, не для вашего случая использования).Поэтому вы должны сделать что-то вроде:

function sleep(ms) {
  console.log("Sleep function called for " + ms + " ms\n")

  return new Promise(resolve => {
    setTimeout(() => {
      console.log("Sleep done!")
      resolve()
    }, ms)
  })
}
...