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..这是错误的