我正在学习承诺。我尝试使用setTimeOut(function(){}, 0)
进行后台处理。在搜索之后,我发现所有这一切都会打破同步流程。在其他代码运行之前它不会运行。
以下帖子说setTimeOut(function,0)函数将同步运行。但是,如果我在承诺中使用它,我发现情况并非如此。文章写道" setTimeout(function(){...},0)简单地将代码排队,以便在当前调用堆栈执行完毕后运行。这对某些事情很有用。"。但是,如果写在promise中,代码将在后台运行,而javascript执行其余的代码。
Is setTimeout a good solution to do async functions with javascript?
如果我在函数setTimeOut(function(){somecode..}, 0)
中使用了一些代码,在一个promise中,它会作为后台进程运行吗?我这样做是为了测试它。
如果我点击身体,我们会检查testPromise是否已经解决。如果有,请追加msge""之后的Msge。之前的msge" Msge"页面加载后立即显示。如果我刷新页面并快速单击正文,则点击和页面上的msge外观之间会有一段延迟。这必须是因为for循环,它们还没有完成。刷新后我快速点击页面。但是,如果我刷新页面并等待一段时间点击,msge就会显示出来。这一定是因为for循环在后台运行...仪式?我认为没有实际的理由这样做,还没有。我只是想了解一下发生了什么。谢谢! Promises是否仅仅用于更好地组织异步函数?
let $body = $('body');
$body.prepend('<p>first</p>');
let testPromise = new Promise(function (resolve, reject) {
setTimeout(function () {
let testArray = [];
let testArray2 = [];
for (i = 0; i <= 99999999; i++) testArray.push(5);
for (j = 0; j <= 99999999; j++) testArray2.push(5);
resolve();
}, 0);
});
$body.on('click', function () {
testPromise.then(function () {
$body.append('<p>Msge that comes After</p>');
});
});
$body.append('<p>Msge that comes Before</p>');
答案 0 :(得分:2)
您的问题已在您关联的帖子中得到解答:
setTimeout(function(){...},0)简单地将代码排队,以便在当前调用堆栈执行完毕后运行。这对某些事情很有用。
所以是的,它是异步的,因为它打破了同步流,但它实际上不会在一个单独的线程上同时执行。如果您的目标是后台处理,请查看webworkers。还有一种方法可以使用iframe进行后台处理。
TLDR:所有后台/并发代码都是异步发生的,但并非所有异步代码都同时发生。
承诺只是一种避免回调地狱的机制。 (见here)。