如何动态添加函数到队列?
How to dynamically add functions to the queue?
我有 render(value)
函数,我用不同的参数调用了多次。我需要链接调用此函数,以便它仅在上一个调用完成后才开始执行。
我需要链接 returns 承诺的函数:
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
*/
}
您可能想尝试以下方法:
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
是 "private" 承诺的概念。如果,当我们解决时,私有承诺与最后一个承诺相同,那么我们就清理它。警告:未经测试!
那只是 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); });
}
我有 render(value)
函数,我用不同的参数调用了多次。我需要链接调用此函数,以便它仅在上一个调用完成后才开始执行。
我需要链接 returns 承诺的函数:
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
*/
}
您可能想尝试以下方法:
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
是 "private" 承诺的概念。如果,当我们解决时,私有承诺与最后一个承诺相同,那么我们就清理它。警告:未经测试!
那只是 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); });
}