【问题标题】:Javascript - Using setTimeOut() in a promise to do "background proccessing" [duplicate]Javascript - 在承诺中使用 setTimeOut() 进行“后台处理”[重复]
【发布时间】: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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 帖子说它不会“同时”执行。然而,在一个承诺中,代码似乎是这样做的。
  • 如前所述,promise 只是一种处理异步函数的机制。他们没有什么特别的。您似乎感到困惑的是,一些异步函数是同时执行的,而另一些则不是。
  • 文章显示 setTimeout(function, 0) 会同步运行,而promise中并非如此。我将尝试提出一个修改后的示例来说明我的意思。
  • setTimeout(func, 0)中,setTimeout函数立即执行,但func仅在事件队列被处理时调用,即在当前运行的代码运行完成之后(调用堆栈必须清空)。在 JavaScript 世界中,我们说 func 运行 异步。但这个词有点偏颇。在其他上下文中,异步 也可能意味着执行顺序未确定。这不是这里的情况:它的定义很明确:如果你有两个这样的对setTimeout 的调用,延迟为 0,它们的回调将以相同的顺序执行。
猜你喜欢
  • 2020-08-26
  • 2023-02-07
  • 2021-04-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
相关资源
最近更新 更多