我是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。对于缩进/格式很抱歉,我不得不从手机上写出来。
谢谢
答案 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");