簡體   English   中英

其他2個完成后執行jQuery函數

[英]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以及何時-首先使用“承諾”功能

C

function dbFindPromise(db, params) {
    var deferred = $.Deferred();
    db.find(params, (err, result) => {
        if(err) {
            deferred.reject(err);
        } else {
            deferred.resolve(result);
        }
    });
    return deferred.promise();
};

然后使用它:

d

$.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM