在我的项目中,我有两个函数分别检索已完成任务的数量和未完成任务的数量。 (我使用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上阅读了很多主题,并且有很多不同的方法(有承诺,然后,完成,修改,承诺数组,变量中的函数......)所以我有点失落。
我想知道这样做的正确方法是什么:)
我尝试了这段代码,但我认为我完全错了......
答案 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,首先你需要宣传任何不返回承诺的异步任务
在你的情况下
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”函数
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);
});
因此,本机承诺,代码A和B,jquery Promises是代码C和D
但是,您可以将代码A与代码D一起使用,或者将代码C与代码B一起使用 - 因为Promise的行为应该相同,无论它们来自何处(在本例中为native vs jquery)