javascript - jquery promise 在解析之前可以被垃圾收集吗?

标签 javascript jquery promise

考虑以下因素:

function listFoo() {
    return $.ajax(...);
}

function listFooey() {
    return $.ajax(...);
}

function parallelLoad() {
    //Note that we do *not* return the promise here.
    $.when(
        listFoo(), listFooey()
    )
    .then (function(fooResponse, fooeyResponse) {
        console.log('then')
        //doStuff
    });
}

//Kick everything off and log
console.log('before parallelLoad');
parallelLoad();
console.log('after parallelLoad');

控制台上的典型输出为 ( jsfiddle ) :

before parallelLoad
after parallelLoad
then

前两个函数返回 ajax Promise,因此对它的引用不会丢失。但是,parallelLoad() 函数不会返回 Promise,因此在执行时,它会创建 Promise,并立即返回,并且 Promise 看起来会立即超出范围。

在实践中,我还没有看到这种模式出现问题,但我想知道这是否只是“运气”。

在上面的示例中,parallelLoad() 是否“安全”(假设 ajax 调用运行时没有服务器/网络错误)then 子句将始终执行?

或者是否存在竞争条件,有时甚至可能无法启动 ajax 调用,或者在 then 子句运行之前 promise 可能会被垃圾收集?

(目前我使用的是 jQuery 3.3.1)

最佳答案

一般来说,不会解决且不再需要的 Promise 可以在解决之前进行垃圾收集。

但是,您的示例中并非如此。即使没有明显的全局变量保留 promise ,它仍然被运行的 ajax 请求引用。由 listFoo()listFooey() 创建的请求使安装在其上的回调保持事件状态,因为它们需要在完成时运行它们。反过来,这些回调引用 promise (或者至少是它们的延迟部分)和安装在它们上的回调,因为它们需要解析 promise 并在运行时调用回调。反过来,这些回调引用由 $.when 调用创建的 promise (或延迟)以及安装在其上的回调,因为在一切解决之前仍然需要它们。只有当两个请求都完成并且所有回调都被执行后,所有内容才会被垃圾收集。

不, promise 永远不会因为某些东西在错误的时间被垃圾收集而错过调用您的回调。

关于javascript - jquery promise 在解析之前可以被垃圾收集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48877041/

相关文章:

javascript - 隐藏/显示隐藏的 div

javascript - 将文本区域中的\n 替换为控制台中的 "invisible"换行符

javascript - 如何同时延迟加载多个组件

javascript - 如何在 body 负载上调用函数

javascript - 防止 JavaScript 中使用迭代的嵌套回调

php - Bootstrap typeahead - 小节(标题)

javascript - 使用 jQuery 方法作为回调参数

jquery - 如何从表中选择两列数据?

javascript - 最初的 promise 成功后又拒绝内心的 promise ?

javascript - Restify & Bluebird - 如何将错误从 catch block 传递到 restify 错误处理程序?