【发布时间】:2023-03-17 19:17:01
【问题描述】:
我正在学习承诺。我尝试使用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) 中使用一些代码,在一个承诺中,它会作为后台进程运行吗?我这样做是为了测试它。
如果我点击正文,我们会检查 testPromise 是否已解决。如果有,请附加 msge “Msge that come after”。页面加载后,消息“之前的消息”就会显示出来。如果我刷新页面并单击正文,很快,单击和页面上出现 msge 之间会有延迟。这一定是因为 for 循环,它们还没有完成。当我刷新后快速单击页面时。但是,如果我刷新页面并等待一段时间单击,msge 就会出现。这一定是因为 for 循环在后台运行……仪式?我认为没有实际理由这样做,目前还没有。我只是想了解正在发生的事情。谢谢! Promise 是否只是为了更好地组织异步函数?
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>');
【问题讨论】:
-
我在 promise 中使用了 setTimeout() 函数,时间延迟为 0。我在 setTimeOut() 中放了一堆 for 循环。我发现的是 for 循环在后台运行,而堆栈的其余部分执行。 Javascript 不会暂停,它会继续执行其他代码。但是,如果您在承诺之外使用 setTimeout .. 情况并非如此。该函数内的代码只有在其他所有内容都执行后才会运行。奇怪的是,函数在 promise 中的行为不同。
标签: javascript jquery promise