只有阵列中的最后一个对象被调用,async.east或每个系列不起作用



我是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;
}

最新更新