[英]Execute a jQuery function after 2 others were finished
在我的項目中,我有兩個函數分別檢索已完成任務的數量和未完成任務的數量。 (我使用NeDB,但這並不重要)。
之后,我想將這兩個數字加在一起。
這是我的代碼:
var completed = 0
, uncompleted = 0;
// Get completed tasks
db.find({ completed: true }, function (err, tasks) {
completed = tasks.length;
console.log(completed); // output 7
});
// Get uncompleted tasks
db.find({ completed: false }, function (err, tasks) {
uncompleted = tasks.length;
console.log(uncompleted); // output 3
});
// This line is executed before the lines above
console.log(completed+uncompleted); // output 0 (I would like to output 10)
如您所見,最后一行輸出0是因為它在兩個函數完成之前執行。
所以我的問題是如何使最后一行輸出10?
我認為我必須使用Promise,但是我閱讀了很多SO主題,並且有很多不同的方法(使用Promise,然后完成,遞延,promise的數組,變量中的函數...),所以我有點失落。
我想知道正確的方法是什么:)
我嘗試了這段代碼,但我認為我完全錯了...
var completed = 0 , uncompleted = 0; // Get completed tasks var getCompleted = function(){ return db.find({ completed: true }, function (err, tasks) { completed = tasks.length; console.log(completed); // output 7 }); } // Get uncompleted tasks var getUncompleted = function(){ return db.find({ completed: false }, function (err, tasks) { uncompleted = tasks.length; console.log(uncompleted); // output 3 }); } var promises = []; promises.push(getCompleted()); promises.push(getUncompleted()); $.when.apply($, promises).done(function () { console.log(completed+uncompleted); // output 0 });
您使用的NeDB
庫不會返回諾言-您可以在嵌套回調中執行以下工作:
db.find({completed: true}, function(err, completeTasks) {
db.find({completed: false}, function(error, incompleteTasks) {
console.log(completeTasks.length + incompleteTasks.length);
});
})
如果要使用Promises,首先需要對所有不返回承諾的異步任務進行承諾
就你而言
function dbFindPromise(db, params) {
return new Promise((resolve, reject) =>
db.find(params, (err, result) => {
if(err) {
reject(err);
} else {
resolve(result);
}
})
)
};
然后,使用此承諾的db find,您的代碼可以編寫為
Promise.all([
dbFindPromise(db, { completed: true }).then(tasks => {
console.log(tasks.length);
return tasks.length;
}),
dbFindPromise(db, { completed: false }).then(tasks => {
console.log(tasks.length);
return tasks.length;
})
]).then(([completed, uncompleted]) => {
console.log(completed + uncompleted);
});
或者,使用jquery Deferred以及何時-首先使用“承諾”功能
function dbFindPromise(db, params) {
var deferred = $.Deferred();
db.find(params, (err, result) => {
if(err) {
deferred.reject(err);
} else {
deferred.resolve(result);
}
});
return deferred.promise();
};
然后使用它:
$.when(dbFindPromise(db, { completed: true }).then(tasks => {
console.log(tasks.length);
return tasks.length;
}), dbFindPromise(db, { completed: false }).then(tasks => {
console.log(tasks.length);
return tasks.length;
})
).done((completed, uncompleted) => {
console.log(completed + uncompleted);
});
因此,原生的Promise,代碼A和B,jquery Promises是代碼C和D
但是,您可以將代碼A與代碼D一起使用,或者將代碼C與代碼B一起使用-因為Promises的行為無論它們來自何處都應該是相同的(在這種情況下,本機vs jquery)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.