完成其他2个之后执行jQuery函数

时间:2017-09-09 00:41:55

标签: javascript jquery promise

在我的项目中,我有两个函数分别检索已完成任务的数量和未完成任务的数量。 (我使用NeDB但没关系)。

之后,我想将这两个数字加在一起。

这是我的代码:

{
    "_id" : "ANTIQUES",
    "freq" : 9.0
}
{
    "_id" : "APPLIANCES",
    "freq" : 1.0
}
{
    "_id" : "ARTS CRAFTS",
    "freq" : 9.0
}
{
    "_id" : "BOOKS MAGAZINES",
    "freq" : 6.0
}

当你看到最后一行输出0时,因为它是在两个函数完成之前执行的。

所以我的问题是如何使最后一行输出10?

我认为我必须使用promises,但我在SO上阅读了很多主题,并且有很多不同的方法(有承诺,然后,完成,修改,承诺数组,变量中的函数......)所以我有点失落。

我想知道这样做的正确方法是什么:)

我尝试了这段代码,但我认为我完全错了......

2 个答案:

答案 0 :(得分:0)

您正在使用的 it('should render correct <div> element', () => { component.find('input').simulate('blur'); component.find('input').simulate('keyDown', { key: 'a' }); expect(component.find('.text-danger').exists()).to.be.true; expect(component.find('.text-danger').name()).to.equal('div'); expect(component.find('strong').text()).to.not.equal('Required'); }); 库不会返回承诺 - 您可以使用这样的嵌套回调执行您的工作:

NeDB

答案 1 :(得分:0)

如果你想使用Promises,首先你需要宣传任何不返回承诺的异步任务

在你的情况下

A

function dbFindPromise(db, params) {
    return new Promise((resolve, reject) => 
        db.find(params, (err, result) => {
            if(err) {
                reject(err);
            } else {
                resolve(result);
            }
        })
    )
};

然后,使用此promisified 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和when - 首先使用“promisified”函数

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);
});

因此,本机承诺,代码A和B,jquery Promises是代码C和D

但是,您可以将代码A与代码D一起使用,或者将代码C与代码B一起使用 - 因为Promise的行为应该相同,无论它们来自何处(在本例中为native vs jquery)