代码之家  ›  专栏  ›  技术社区  ›  Sangram Badi

如何处理ExpressJS回调以及如何更新函数中对象的属性?

  •  0
  • Sangram Badi  · 技术社区  · 6 年前

    我有两个JS文件。我可以通过调用bookdao.getActiveBookByCategoryID()从MongoDB获取数据。

    我的问题

    在categorydao.js文件中,我正在尝试更新 resultJson.book_count 里面 BookDao.getActiveBookByCategoryId() 方法。但它没有更新。我能知道怎么修这个吗? 在这里 book_count 中的属性 resultJson 仍为0。

    类别道.js

    module.exports.getAllActiveCategory = (callback) => {
        Category.find({
            is_delete : false
        }, (error, result) => {
            if(error) {
                console.log(error);
                callback(commonUtil.ERROR);
            }
    
            if(result) {
                var categoryArray = [];
                for(var i=0; i<result.length; i++) {
                    var categorySingle = result[i];
                    var resultJson = {
                        _id : categorySingle._id,
                        category_name : categorySingle.category_name,
                        created_on : categorySingle.created_on,
                        book_count : 0
                    }
    
                    BookDao.getActiveBookByCategoryId(categorySingle._id, (bookResult) => {
                        if(bookResult) {
                            if(bookResult.length > 0) {    
                                resultJson.book_count = bookResult.length;
                            }
                        }
                    });
                    categoryArray.push(resultJson);
                }
                callback(categoryArray);
            }
        });
    }
    

    书道.js

    module.exports.getActiveBookByCategoryId = (categoryId, callback) => {
        Book.find({
            is_delete : false,
            category : categoryId
        }, (error, result) => {
            if(error) {
                console.log(error);
                callback(commonUtil.ERROR);
            }
    
            if(result) {
                callback(result);
            }
        });
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Rahul Sharma    6 年前

    用你的代码试试这个 categoryArray.push(resultJson); 不会等的 BookDao.getActiveBookByCategoryId 因为异步行为而结束。

    module.exports.getActiveBookByCategoryId = (categoryId) => {
        return Book.count({
            is_delete: false,
            category: categoryId
        });
    }
    
    
    module.exports.getAllActiveCategory = async () => {
        try {
            // Find all category
            const result = await Category.find({
                is_delete: false
            });
    
            // Create array of promise
            const promises = result.map(categorySingle => BookDao.getActiveBookByCategoryId(categorySingle._id));
            // Get array of Category count
            const data = await Promise.all(promises);
            // update count in result
            return result.map((categorySingle, i) => {
                categorySingle.book_count = data[i];
                return categorySingle;
            });
        } catch (error) {
            console.log(error);
        }
    }