【问题标题】:Sails JS : How to return a value from a serviceSails JS:如何从服务返回值
【发布时间】:2015-03-20 17:37:41
【问题描述】:

我正在用sails js 创建一个服务。我想在返回之前更新 totalCount 的值。但问题是当返回在 async.series 的回调中时,我在调用它时得到一个 undefined 。我该怎么做?

var totalCount = 0;

    async.series([
        function getProducts(cb_series){
            Inventory.find({sku_id : sku_id, bay_id : bay_id})
                .then(function(inventory_items){

                    async.each(inventory_items, function(item, cb_each){
                        totalCount = totalCount + item.physical_count;
                        cb_each();
                    }, function(err){
                        if(err)
                            console.log(err);

                        cb_series();
                    });             
                });
        }
    ], function returnResult(err, cb){
        if(err)
            console.log(err);

        return totalCount;
    });

【问题讨论】:

  • 您是否使用async.each 进行同步求和?
  • 因为查找的结果是一个数组。它将返回超过 1 个符合我的条件的实例,我正在添加所有这些实例,这就是我使用 async each 的原因
  • 是的,inventory_items 是一个数组。但是你可以用一个简单的for 循环来循环它,不需要async?
  • 哦。好,谢谢。我应该在什么时候使用异步?
  • 仅当“循环体”为异步时。但是当你使用 Promise 时,实际上从来没有。

标签: javascript asynchronous sails.js


【解决方案1】:

我不完全确定您要做什么。但您可能希望在这样的回调中传递 totalCount:

function getProducts(callback){
    Inventory.find({sku_id : sku_id, bay_id : bay_id}).then(
        function(inventory_items){
            callback(null, inventory_items.length)
        }, function(err){
            console.log(err);
            callback(err);
        });
}

如果有错误,它将以错误作为第一个参数进行回调,因此对其进行空检查。如果第一个参数为空,那么第二个参数就是数组的长度。

如果您希望返回所有产品而不仅仅是长度(正如函数名称所暗示的那样),那么它非常相似:

function getProducts(callback){
    Inventory.find({sku_id : sku_id, bay_id : bay_id}).then(
        function(inventory_items){
            callback(null, inventory_items)
        }, function(err){
            console.log(err);
            callback(err);
        });
}

对于第一种情况,您会像这样使用它:

getProducts(function(err, productCount) {
    if(err) {
        console.log(err);
        return err;
    } else {
        var totalCount = productCount;
    }
    //etc etc...
}

...或者第二种情况:

getProducts(function(err,products) {
    if(err) {
        console.log(err);
        return err;
    } else {
        var productArray = products;
    }
    //etc etc...
}

【讨论】:

  • 这是唯一的方法吗?有没有办法让结果“开箱即用”?不敢相信没有。
  • @patryk “开箱即用”是什么意思?
  • 在我曾经使用过的任何编程语言中,我从来没有遇到过问题,我无法访问之前创建的变量,但在同一个函数中。除非它以某种方式被杀死,或者它的内容被改变了。我不明白为什么在上面的示例中,变量“totalCount”在函数 getProducts() 中不可用。
  • @Patryk- 我不确定您指的是哪一个,但您可能没有查看相同的函数。我可以向您保证,Javascript 变量可以在声明它们的函数中访问,也许您遗漏了一些东西。如果您具体,我很乐意解释发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多