【问题标题】:Node js execute function before complete multiple lines of codeNode js在完成多行代码之前执行函数
【发布时间】:2023-03-13 06:00:01
【问题描述】:

这个函数:

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写了这段代码,它逐行执行 因为没有什么叫做同步和异步。

我需要像 python 一样执行这段代码(逐行)

【问题讨论】:

  • 代码正在逐行执行。 setTimeout() API 安排在未来某个时间调用一个函数,但 setTimeout() 本身会立即返回。
  • 好的,如果我需要它来打印num 1 并让它等到 9 秒结束然后设置 global.name = max 然后打印 num 2num 3 然后通过console.log(global.name) 打印 max 而不是 undefined
  • 你需要使用promise或者回调函数stackoverflow.com/questions/35544073/…
  • 我知道这一点,要理解我的意思,请随时查看此文件drive.google.com/file/d/1gkMBXOusP8k93fMvs7uFnSXAVP9CocBb/view 这里我在上下文中设置 ```Discovery_context: global.Discovery_context``` 我在运行此代码时我第一次得到 global.Discovery_context 是未定义的,所以如果你试图在 updateMessage 函数之外打印它,你将得到未定义我该如何解决这个问题?

标签: javascript node.js chatbot watson-assistant watson-discovery


【解决方案1】:

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();

【讨论】:

  • 我知道这一点,要理解我的意思,请随时查看此文件drive.google.com/file/d/1gkMBXOusP8k93fMvs7uFnSXAVP9CocBb/… 这里我在上下文中设置 ```Discovery_context: global.Discovery_context``` 我在运行此代码时我第一次得到global.Discovery_context 是未定义的,所以如果你试图在updateMessage 函数之外打印它,你将得到未定义我该如何解决这个问题?
【解决方案2】:

在 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

【讨论】:

    猜你喜欢
    • 2018-05-27
    • 2020-05-25
    • 2019-02-22
    • 2012-06-26
    • 2016-08-29
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多