Javascript - 在承诺中使用setTimeOut()来执行"后台处理"

时间:2017-04-23 20:38:38

标签: javascript jquery promise

我正在学习承诺。我尝试使用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>');

1 个答案:

答案 0 :(得分:2)

您的问题已在您关联的帖子中得到解答:

  

setTimeout(function(){...},0)简单地将代码排队,以便在当前调用堆栈执行完毕后运行。这对某些事情很有用。

     

所以是的,它是异步的,因为它打破了同步流,但它实际上不会在一个单独的线程上同时执行。如果您的目标是后台处理,请查看webworkers。还有一种方法可以使用iframe进行后台处理。

     

TLDR:所有后台/并发代码都是异步发生的,但并非所有异步代码都同时发生。

承诺只是一种避免回调地狱的机制。 (见here)。