我是Promises领域的新手。我已经实现了一个查找功能,其中使用Q Promise库从MongoDB获取文档。这是代码。
import { Collection } from "path"; // mongoose schema
import Q from "q";
const deferred = Q.defer();
const findOneDocument = (query) => {
Collection.findOne(query, (err, res) => {
if(err) {
deferred.reject(err);
}
else {
deferred.resolve(res);
}
});
return deferred.promise;
}
它返回Q承诺,当我从数据库中获取数据时可以解决。
现在,我必须在不同的查询值上找到多个收集文档,例如[" value A"," value b"]。
但是,当我使用async..east或每个系列的数组的每个值调用findone时。它仅适用于最后一个值"值b"。我尝试的代码
const promises = [];
async.each(array, (element, callback) => {
// collecting the promise returned
promises.push(findOne({"property": element}));
callback();
}, (err) => {
if(err) {
console.log("error has occured");
console.dir(err);
}
else {
console.log("all the values have been processed");
Promise.all(promises).then((values) => {
console.log("the promise of all values have been resolved");
console.log("the value is :"+JSON.stringify(values));
}, (err) => {
console.dir(err);
});
}
});
任何帮助将不胜感激。谢谢!
您在所有调用findOne
中使用一个和相同的deferred
变量,因此一旦解决了诺言,下次致电findOne
时,它将不会从头开始。所有这些findOne
调用实际上将返回相同的单个承诺对象。
因此,在findOne
的范围中移动该变量:
const findOneDocument = (query) => {
const deferred = Q.defer();
Collection.findOne(query, (err, res) => {
if(err) {
deferred.reject(err);
}
else {
deferred.resolve(res);
}
});
return deferred.promise;
}