Странное поведение из Console.log () в обещаниях - PullRequest
0 голосов
/ 23 сентября 2019

поэтому я делаю некоторую работу с обещаниями и получаю странное поведение, когда я использую console.log () в обещании.

КОД

function doSomething(msg){ 
      return new Promise(
        (myresolve, myreject) => {
          setTimeout(
             () => {
              console.log(msg);
              console.log('In the promise')
              myresolve();
            }, 
            1000);
        }); 
    }



   doSomething("1st Call")
  .then(function() {
    doSomething("2nd Call");
    console.log('leaving 2nd promise'); 
  })
  .then(function() {
    doSomething("3rd Call");
    console.log('leaving 3rd promise');
}); 

ВЫХОД НА КОНСОЛЬ

  • '1st Call'
  • «В обещании»
  • «оставляя второе обещание»
  • «оставляя третье обещание»
  • «Второй звонок»
  • «В обещании»
  • '3rd Call'
  • 'В обещании'

Основной вопрос Почему JavaScript не читает строки кода?в последовательном порядке один раз в обещании?Похоже, что сначала выполняется проход, сначала запись в консоль, а затем возвращается к коду и выполняется функции, которые обещают выполнить после метода .then.Любое понимание будет с благодарностью ...

1 Ответ

0 голосов
/ 23 сентября 2019
doSomething("2nd Call");
console.log('leaving 2nd promise'); 

Выполнение чего-либо выполняется асинхронно и для завершения его выполнения потребуется ~1000 м / с.Итак, когда doSomething("2nd Call"); первоначально вызывается, ваш код переходит в ваш метод, возвращает обещание и начинает setTimeout.Затем "leaving 2nd promise" регистрируется.Позже, в конце пути, setTimeout, который мы инициировали ранее, вызывая doSomething("2nd Call"), завершится, и он будет регистрировать "2nd Call" на консоли.Чтобы дождаться завершения исходного вызова на doSomething("2nd Call"), вам нужно использовать .then() (или await) в обещании, которое он возвращает, чтобы вы могли выполнить свой код, когда обещание разрешится:

function doSomething(msg) {
  return new Promise(
    (myresolve, myreject) => {
      setTimeout(
        () => {
          console.log(msg);
          console.log('In the promise')
          myresolve();
        },
        1000);
    });
}



doSomething("1st Call")
  .then(() => doSomething("2nd Call"))
  .then(() => console.log('leaving 2nd promise'))
  .then(() => doSomething("3rd Call"))
  .then(() => console.log('leaving 3rd promise'));
...