【发布时间】:2015-10-26 08:12:42
【问题描述】:
我试图使用 Promise 来强制序列化一系列 Ajax 调用。每次用户按下按钮时,都会进行一次这些 Ajax 调用。我可以成功序列化这样的操作:
// sample async function
// real-world this is an Ajax call
function delay(val) {
log("start: ", val);
return new Promise(function(resolve) {
setTimeout(function() {
log("end: ", val);
resolve();
}, 500);
});
}
// initialize p to a resolved promise
var p = Promise.resolve();
var v = 1;
// each click adds a new task to
// the serially executed queue
$("#run").click(function() {
// How to detect here that there are no other unresolved .then()
// handlers on the current value of p?
p = p.then(function() {
return delay(v++);
});
});
工作演示:http://jsfiddle.net/jfriend00/4hfyahs3/
但是,这会构建一个可能永无止境的承诺链,因为存储最后一个承诺的变量 p 永远不会被清除。每一个新的操作都只是链接到先前的承诺。所以,我在想,为了良好的内存管理,我应该能够检测到何时没有更多的.then() 处理程序可以在p 的当前值上运行,然后我可以重置p 的值,使确保之前的 Promise 处理程序链可能在闭包中持有的任何对象都符合垃圾回收条件。
所以,我想知道如何在给定的.then() 处理程序中知道在此链中没有更多的.then() 处理程序可以调用,因此,我可以执行p = Promise.resolve() 来重置p 和释放之前的 Promise 链,而不是不断地添加它。
【问题讨论】:
标签: javascript asynchronous promise