Node js выполняет функцию перед завершением нескольких строк кода

Эта функция:

function print(){
  console.log('num 1')

  setTimeout(() => {
    global.name = 'max'
    console.log('num 2')
  },9000);

  console.log('num 3');
}
print();
console.log(global.name)

пишет это:

num 1
num 3
undefined
num 2

И мне нужно:

  1. распечатать num 1
  2. подождите до 9 секунд
  3. установить global.name = max
  4. распечатать num 2
  5. распечатать num 3
  6. console.log(global.name)
  7. печатать max, а не undefined

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

Мне нужно, чтобы этот код выполнялся как python (построчно)


person mahmoudbustami    schedule 03.09.2019    source источник
comment
Код выполняется построчно. API setTimeout() обеспечивает вызов функции в будущем, но сам setTimeout() возвращает результат немедленно.   -  person Pointy    schedule 03.09.2019
comment
хорошо, что, если мне нужно, чтобы он напечатал num 1 и заставил его ждать, пока не закончатся 9 секунд, затем установите global.name = max, затем напечатайте num 2, num 3, затем console.log(global.name) напечатайте max, а не undefined   -  person mahmoudbustami    schedule 03.09.2019
comment
Вам нужно использовать обещание stackoverflow. ком/вопросы/35544073/   -  person Ansar    schedule 03.09.2019
comment
Вам нужно использовать обещание и/или функцию обратного вызова "> stackoverflow.com/questions/35544073/   -  person Ansar    schedule 03.09.2019
comment
я знаю это, чтобы понять, что я имею в виду, пожалуйста, не стесняйтесь увидеть этот файл drive.google. com/file/d/1gkMBXOusP8k93fMvs7uFnSXAVP9CocBb/view здесь я установил в контексте ``` Discovery_context: global.Discovery_context```, когда я запускаю этот код в первый раз, я получаю global.Discovery_context не определен, поэтому, если вы попытался напечатать его вне функции updateMessage, вы получите undefined, как я могу это исправить?   -  person mahmoudbustami    schedule 03.09.2019


Ответы (2)


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

let name = "Unknown";

function print() {
    console.log('num 1');

    setTimeout(() => {
        this.name = 'max';
        console.log('num 2');
        console.log('num 3');
        console.log(this.name);

    }, 900);


}

print();
person Pascal K.    schedule 03.09.2019
comment
я это знаю, чтобы понять, что я имею в виду, пожалуйста, посмотрите этот файл drive.google.com/file/d/1gkMBXOusP8k93fMvs7uFnSXAVP9CocBb/ здесь я установил в контексте ``` Discovery_context: global.Discovery_context```, когда я запускаю этот код в первый раз, когда я получаю global.Discovery_context, не определен, поэтому, если вы пытались напечатать его вне функции updateMessage, вы получите undefined, как я могу это исправить? - person mahmoudbustami; 03.09.2019

Самый понятный способ работы с синхронностью в JavaScript — это асинхронные функции. Чтобы дать вам представление о том, как это может выглядеть:

// To simulate the function you're going to use the snippet in
(async () => {

  async function print(){
    console.log('num 1')

    // await stops the execution until the setTimeout in sleep is done (non blocking)
    await sleep(9000);

    global.name = 'max'
    console.log('num 2')

    console.log('num 3');
  }

  // wait for the print function to finish
  await print();

  console.log(global.name)

})();

// Little utility function
function sleep(time) {
  return new Promise(resolve => setTimeout(resolve, time))
}

Подробнее об async/await можно прочитать здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

person Wilco Waaijer    schedule 03.09.2019