Синхронизация примера кода с обещанием, ожиданием и ожиданием - PullRequest
0 голосов
/ 17 декабря 2018

Я изучаю обещания в Узле JS.Я наткнулся на определенный код, который хочу синхронизировать (из любопытства).

function test1(){
  return new Promise(async function(resolve,reject){
      await promise1();
      await promise2();
      await promise3();
      console.log('last');
      resolve(true);
  })

}

async function promise1(){
  return new Promise(async function(resolve,reject){
      console.log('promise1');
      await setTimeout(myFunc, 1500, resolve);
      console.log("111");
  });
}

function myFunc(resolve) {
  console.log(`arg was => resolve`);
  resolve(true);
}

function promise2(){
  return new Promise(function(resolve,reject){
      console.log('promise2');
      resolve(true);
  });
}

function promise3(){
  return new Promise(function(resolve,reject){
      console.log('promise3');
      resolve(true);
  });
}

function callTest1(){
  for(i=0;i<4;i++){
    test1();
  }
}

callTest1();

Я хочу вывод, подобный следующему:

promise1
arg was => resolve
111
promise2
promise3
last
promise1
arg was => resolve
111
promise2
promise3
last
promise1
arg was => resolve
111
promise2
promise3
last
promise1
arg was => resolve
111
promise2
promise3
last

Я хочу, чтобы мой код ждал setTimeOut, а затем только после него должен запускать другую функцию.Я знаю, в узле js у нас есть концепция асинхронизации, но почему-то я хочу, чтобы этот код был синхронизирован.

1 Ответ

0 голосов
/ 17 декабря 2018

Ключевое правило в node.js - невозможность синхронизации асинхронного кода.

Вы можете легко получить желаемый результат, сделав callTest сам асинхронным, например:

async function callTest1() {
  for(i=0;i<4;i++){
    await test1();
  }
}

Теперь ваш вывод будет отображаться так, как вам нужно, но, конечно, вызов callTest1() немедленно вернется (и вывод будет напечатан позже).

...