Порядок выполнения обещаний в javascript

#javascript #node.js #promise #async-await

#javascript #node.js #обещание #асинхронный-ожидание

Вопрос:

У меня есть пример программы, чтобы понять, как promises и async/ await работает. Но я немного смущен порядком выполнения обещаний. Кто-нибудь может объяснить, как это работает?

СЛУЧАЙ 1

 //Promise 1
let promiseTest = new Promise((resolve, reject) => {
  var k = 0;
  for(i=0; i< 1000; i   ){
    k  = i;
  }
  resolve(k);
  console.log("Inside promise1")
});

promiseTest.then((res)=> {
    console.log('Promise1 result : '  res);
}).then(() => {
    promiseTest2.then((res) => {
        console.log(res)
    });
}).then(finish)
.catch((err) => {
 console.log(err)
});

//Promise 2
let promiseTest2 = new Promise ((resolve, reject) => {
    console.log("Inside promise2")
});

function finish(){
    console.log("finished promise");
}
  

Для этого я получаю результат в виде

Результат

 Inside promise1
Inside promise2
Promise1 result : 499500
finished promise
  

СЛУЧАЙ 2

У меня есть другой пример, делающий то же самое с async / await. Но в этом порядке выполнение является правильным.

 //Async await test
async function AsyncTest(){
    console.log("Inside async1")
    var k = 0;
    for(i=0; i< 1000; i   ){
      k  = i;
    }
  console.log('async1 result : '  k);
  const result =  await AsyncTest2();
  console.log(result)
  console.log("finished async");
}

async function AsyncTest2(){
   return "Inside async2";
}

AsyncTest();
  

Результат

 Inside async1
async1 result : 499500
Inside async2
finished async
  

Спасибо.

Комментарии:

1. Вы не возвращаете второе обещание из обратного вызова, поэтому оно не является частью той же цепочки.

2. @jonrsharpe можете ли вы исправить ту часть, где я делаю неправильно?

3. return promiseTest2.then(...)

4. ок, здорово, что я это исправил. и это работает в правильном порядке. Итак, какая разница в обоих случаях?

Ответ №1:

Если вы вызываете .then(cb) обещание, оно создает и возвращает новое обещание, которое преобразуется в то, что возвращает обратный вызов. Если это само обещание, то это обещание будет ожидаться до продолжения цепочки. В вашем случае вы сделали:

 promiseTest.then((res)=> {
 console.log('Promise1 result : '  res);
 return undefined; // implicit return
}).then(() => {
 /* doesnt matter what you do here */
 return undefined;
}).then(finish)
  

Присоединяете ли вы другое .then к другому обещанию, не имеет значения для этой цепочки обещаний.

Комментарии:

1. Итак, в чем разница между обоими методами? Оба работают в одном формате?