我有render(value)
功能,我用不同的参数多次调用。我需要对这个函数进行链接调用,以便它只在前一个调用完成时才开始执行。
我需要链接的函数返回一个promise:
function render(value){
var deferred = $q.defer();
/* Some logic here */
return deferred.promise;
}
我应该在这里放置什么?
function onClick(value){
/*
Add render(value) to the queue. And start execution if queue is empty
*/
}
答案 0 :(得分:1)
那只是then
链接 -
创建队列:
var queue = $q.when();
添加要在队列上运行的函数:
queue = queue.then(function(){ // need to reassign since promises are immutable.
console.log("Added!");
});
所以,在你的例子中:
function onClick(value){
queue = queue.then(function(){ return render(value); });
}
答案 1 :(得分:0)
您可能想尝试以下方面的内容:
var lastPromise;
function onClick(value) {
var promise;
if( lastPromise ) {
promise = lastPromise.then(function() {
return render(value);
}).then(cleanup);
}
else {
promise = render(value).then(cleanup);
}
lastPromise = promise;
function cleanup() {
if( promise === lastPromise ) {
lastPromise = null;
}
}
}
lastPromise
保留最后的链接承诺;这可以确保每个render()
在前一个完成之后运行。内部promise
是“私人”承诺的概念。如果,当我们得到解决时,私人承诺与最后承诺相同,那么我们将其清理干净。警告:未经测试!