考虑以下因素:
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/