承诺异步通话

时间:2019-05-30 13:46:41

标签: javascript node.js asynchronous promise

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

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

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

我希望看到:

栏//立即打印

foo //循环结束后打印

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

Ps。对于缩进/格式很抱歉,我不得不从手机上写出来。

谢谢

2 个答案:

答案 0 :(得分:2)

但是您的诺言没有什么不同步的。创建一个Promise开始执行该功能,并且JS始终运行到完成。

通常,promise用于启动异步的东西,例如API调用,甚至是普通的setTimeout,它们在JS的线程之外运行。但是,您的代码将遍历空循环数以千计的次数,并且仅在之后之后将运行以下任何行。

用超时替换空行,它将变为异步:

var p = new Promise(resolve => {
  setTimeout(() => resolve("foo"), 2000);
});

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

答案 1 :(得分:2)

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

您还可以通过多任务来实现并发执行:如果停止两者之间的循环,则其他代码可以同时运行:

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

 console.log("in the meantime");