Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-在承诺中使用setTimeOut();“背景处理”;_Javascript_Jquery_Promise - Fatal编程技术网

Javascript-在承诺中使用setTimeOut();“背景处理”;

Javascript-在承诺中使用setTimeOut();“背景处理”;,javascript,jquery,promise,Javascript,Jquery,Promise,我正在学习承诺。我尝试使用setTimeOut(function(){},0)进行后台处理。在搜索它之后,我发现所有这些都会打破同步流。在其他代码运行之前,它不会运行 下面的帖子说setTimeOut(函数,0)函数将同步运行。然而,如果我在承诺中使用它,我发现情况并非如此。文章写道:“setTimeout(function(){…},0)只是将当前调用堆栈执行完毕后要运行的代码排队。这对某些事情可能很有用。”。但是,如果写在承诺中,代码将在后台运行,而javascript将执行其余代码 如果

我正在学习承诺。我尝试使用
setTimeOut(function(){},0)
进行后台处理。在搜索它之后,我发现所有这些都会打破同步流。在其他代码运行之前,它不会运行

下面的帖子说setTimeOut(函数,0)函数将同步运行。然而,如果我在承诺中使用它,我发现情况并非如此。文章写道:“setTimeout(function(){…},0)只是将当前调用堆栈执行完毕后要运行的代码排队。这对某些事情可能很有用。”。但是,如果写在承诺中,代码将在后台运行,而javascript将执行其余代码

如果我在函数
setTimeOut(function(){somecode..},0)
中使用一些代码,那么它会作为后台进程运行吗?我这样做是为了测试它

如果我单击主体,我们将检查testPromise是否已解决。如果有,请附加msge“后面的msge”。页面加载后,msge“msge在前面出现”。如果我刷新页面并点击主体,很快,在点击和页面上出现msge之间会有一个延迟。这一定是因为for循环尚未完成。当我在页面上快速点击刷新后就是了。但是,如果我刷新页面并等待一段时间单击,msge就会消失。这一定是因为for循环在后台运行…rite?我认为没有实际的理由这样做,目前还没有。我只是想了解发生了什么。谢谢承诺只是用来更好地组织异步函数吗

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>');
let$body=$('body');
$body.prepend(“first

”); let testPromise=新承诺(函数(解析、拒绝){ setTimeout(函数(){ 设testArray=[]; 设testArray2=[];
对于(i=0;i你的问题已经在你链接的帖子中得到了回答:

setTimeout(function(){…},0)只是将当前调用堆栈执行完毕后要运行的代码排队。这对某些事情很有用

是的,它是异步的,因为它打破了同步流,但它实际上不会在单独的线程上并发执行。如果你的目标是后台处理,那么看看webworkers。还有一种方法可以使用iFrame进行后台处理

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


承诺只是一种避免回调地狱的机制。(请参阅)。

您的问题已经在您链接的帖子中得到了回答:

setTimeout(function(){…},0)只是将当前调用堆栈执行完毕后要运行的代码排队。这对某些事情很有用

是的,它是异步的,因为它打破了同步流,但它实际上不会在单独的线程上并发执行。如果你的目标是后台处理,那么看看webworkers。还有一种方法可以使用iFrame进行后台处理

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


承诺只是一种避免回调地狱的机制。(请参阅)。

邮报说它不会“并发”执行。但是,在promise中,代码似乎是这样做的。如前所述,promise只是一种处理异步函数的机制。它们没有什么特别之处。您似乎感到困惑的是,一些异步函数是并发执行的,而其他函数不是。本文显示setTimeout(函数,0)将同步运行,这不是承诺中的情况。我将尝试提出一个修订的示例来说明我的意思。在
setTimeout(func,0)
中,会立即执行
setTimeout
函数,但只有在处理事件队列时,即在当前运行的代码运行到完成之后,才会调用func(调用堆栈必须清空)。在JavaScript世界中,我们说func是异步运行的。但是这个术语有点偏颇。在其他上下文中,异步也可能意味着执行顺序没有确定。这里不是这样的:它定义得很好:如果有两个这样的调用
setTimeout
,延迟为0,那么它们的回调将在相同的时间内执行邮报说它不会“同时”执行。但是,在promise中,代码似乎是这样做的。如前所述,promise只是一种处理异步函数的机制。它们没有什么特别之处。您似乎感到困惑的是,一些异步函数是并发执行的,而其他函数不是。本文显示setTimeout(函数,0)将同步运行,这不是承诺中的情况。我将尝试提出一个修订的示例来说明我的意思。在
setTimeout(func,0)
中,会立即执行
setTimeout
函数,但只有在处理事件队列时,即在当前运行的代码运行到完成之后,才会调用func(调用堆栈必须清空)。在JavaScript世界中,我们说func是异步运行的。但是这个术语有点偏颇。在其他上下文中,异步也可能意味着执行顺序没有确定。这里不是这样的:它定义得很好:如果有两个这样的调用
setTimeout
,延迟为0,那么它们的回调将在相同的时间内执行rder。我在承诺内使用了setTimeout()函数,时间延迟为0。我在setTimeout()内放置了一组for循环。我发现的是在后台运行for循环,而堆栈的其余部分则在执行。Javascript不会暂停,它会继续执行其他代码。但是,如果在承诺外使用setTimeout..这是错误的