【问题标题】:Promise async call承诺异步调用
【发布时间】:2019-05-30 22:03:04
【问题描述】:

我是 node js 的新手,并试图了解如何进行异步调用。 我试图将一个函数包装到一个承诺中以使其异步。为简单起见,该函数只是一个需要时间的循环:

var p = new Promise(resolve => {
    for (let i=0;i<999999999;i++){}
    resolve('foo')
});

p.then(function (value) { console.log(value);});
console.log('bar');

我期待看到:

bar // 立即打印

foo // 循环结束后打印

相反,它们都是在循环完成后打印的。 如何让循环块异步运行?

附言。为缩进/格式道歉,我不得不用手机写这个。

谢谢

【问题讨论】:

  • “异步”是什么意思?在另一个线程中?
  • 您可能正在阻止写入控制台的 IO 调用。
  • javascript只有一个线程。
  • 你编写代码的方式会等到你的promise函数完成操作
  • @JonasWilms 是思考代码如何工作的方式。

标签: javascript node.js asynchronous promise


【解决方案1】:

您似乎假设“异步代码”涉及并发,即代码将同时在另一个线程中运行。事实并非如此。除非您有意启动另一个线程,否则 JS 本身将在单个线程中运行。因此,无论您对 Promise 做什么:要么先运行循环然后运行日志,要么先运行日志然后运行循环。

你也可以通过多任务实现并发执行:如果你停止中间的循环,其他代码可以同时运行:

 (async function() {
    while(true) {
       console.log("loop");
       await Promise.resolve();
    }
 })();

 console.log("in the meantime");

【讨论】:

    【解决方案2】:

    但是你的承诺没有什么异步的。创建一个promise会启动函数的执行,而JS总是运行到完成。

    通常,promise 用于启动异步操作,例如 API 调用,甚至是普通的 setTimeout,它们在 JS 的线程之外运行。但是,您的代码将遍历空循环 bajillion 次,并且只有 之后才会运行任何后续行。

    把空行换成超时,就变成async了:

    var p = new Promise(resolve => {
      setTimeout(() => resolve("foo"), 2000);
    });
    
    p.then(function(value) {
      console.log(value);
    });
    console.log('bar');

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-10
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多