代码之家  ›  专栏  ›  技术社区  ›  merseyside

使用Mongoose处理嵌套回调/承诺

  •  1
  • merseyside  · 技术社区  · 7 年前

    通过迭代,我能够填充我需要的结果。不幸的是,我遇到的问题是,在阵列中收集所需信息之前,响应被发回。我理解这可以通过回调/承诺来处理。我尝试了很多方法,但我只是没有成功。我现在正试图利用 Q library 以促进回调。我真的很感激你的洞察力。下面是我目前遇到的问题的一个片段:

    var length = Object.keys(purchasesArray).length;
    var jsonArray = [];
    
    var getProductDetails = function () {
    var deferred = Q.defer();
    for (var i = 0; i < length; i++) {
        var property = Object.keys(purchasesArray)[i];
        if (purchasesArray.hasOwnProperty(property)) {
            var productID = property;
            var productQuery = Product.find({asin: 
            productQuery.exec(function (err, productList) {
            jsonArray.push({"productName": productList[0].productName,
                               "quantity": purchasesArray[productID]});
            });
        }
    }
    
    return deferred.promise;
    };
    
    getProductDetails().then(function sendResponse() {
        console.log(jsonArray);
        response = {
            "message": "The action was successful",
            "products": jsonArray
        };
        res.send(response);
        return;
     }).fail(function (err) {
         console.log(err);
        })
     });
    

    jsonArray

    使现代化

    Roamer-1888

    基本上 getProductDetails() 函数,我试图从Mongoose查询中检索产品名称,同时映射中每个项目的数量 purchasesArray 最后,我想从函数中得出以下回应:

     response = {
         "message": "The action was successful",
         "products": jsonArray
     };
    

    杰索纳雷 getProductDetails :

    jsonArray.push({
        "productName": products[index].productName,
        "quantity": purchasesArray[productID]
    });
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Roamer-1888    7 年前

    假设: purchasesArray 是早期查询的结果,则表明您正在尝试:

    • 项目
    • 形成一个对象数组,每个对象包含从查询和原始

    如果是这样,并且没有其他猜测,那么以下模式应该可以完成这项工作:

    var getProductDetails = function() {
        // map purchasesArray to an array of promises
        var promises = purchasesArray.map(function(item) {
            return Product.findOne({
                asin: item.productID // some property of the desired item
            }).exec()
            .then(function product {
                // Here you can freely compose an object comprising data from :
                // * the synchronously derived `item` (an element of 'purchasesArray`)
                // * the asynchronously derived `product` (from database).
                // `item` is still available thanks to "closure".
                // For example :
                return {
                    'productName': product.name,
                    'quantity': item.quantity,
                    'unitPrice': product.unitPrice
                };
            })
            // Here, by catching, no individual error will cause the whole response to fail.
            .then(null, (err) => null); 
        });
        return Promise.all(promises); // return a promise that settles when all `promises` are fulfilled or any one of them fails.
    };
    
    getProductDetails().then(results => {
        console.log(results); // `results` is an array of the objects composed in getProductDetails(), with properties  'productName', 'quantity' etc.
        res.json({
            'message': "The action was successful",
            'products': results
        });
    }).catch(err => {
        console.log(err);
        res.sendStatus(500); // or similar
    });
    

    最终的代码在细节上会有所不同,尤其是在合成对象的组成方面。不要依赖我的猜测。