Лучшее понимание на Promise.prototype.then - PullRequest
0 голосов
/ 25 мая 2018

У меня есть код, похожий на этот

function hello(){
     setTimeout(() => console.log("after 3sec"), 3000);
 }
  let x = Promise.resolve()
  x.then(() => {
  hello()
  }).then(() => console.log("after 1st then"))

теперь вывод странный, функция console.log во 2-м, затем выполняется перед консольным .log в 1-м, затем ... как сделать его синхронным,я имею в виду, как я могу сказать, что 2-й .then должен быть выполнен только после 1-го .then

1 Ответ

0 голосов
/ 25 мая 2018

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

let x = Promise.resolve()
x.then(() => {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log("after 500ms");
      resolve();
    }, 500);
  });
}).then(() => console.log("after 1st then"))

Что касается вашего нового вопроса, вам нужно будет hello вернуть обещание, а затем вернуть вызов hello, чтобы он мог быть прикован цепью:

function hello() {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log("after 500ms");
      resolve();
    }, 500);
  });
}
let x = Promise.resolve()
x.then(() => {
  return hello()
}).then(() => console.log("after 1st then"))
...