从嵌套函数返回

时间:2016-07-17 12:53:30

标签: javascript node.js

我是node / javascript的新手,所以我的问题可能很简单,但它给我带来了麻烦。

我有以下代码。它成功检查数据库中的UnitOwner值。问题是if语句else if (Owner){之后的代码按预期执行,但是,程序永远不会到达return reply(output);行,我认为应该这样做。

我认为这是我从Owner.findOne(...代码回来的方式。

谁能看到我做错了什么?

exports.sale = {
    tags: ['api'],
    validate : {
        //blah blah blah
    },
    handler : function(request, reply) {
        var output = {
            success: true,
            operations: [],
            epoch: Date.now()
        };

        Unit.findById(request.payload.deviceNumber, function(err, device) {
            if (err) {
                //blah blah blah
            }
            if (device) {
                Owner.findOne({OwnerId: device.Owner}, function(err, Owner) {
                    if (err) {
                        //blah blah blah
                    }
                    else if (Owner){
                        //make changes to output.operations

                    }
                });
            } else {
                output.success = false;

            }
            return reply(output);

        });

    }
};

2 个答案:

答案 0 :(得分:1)

代码中存在几个问题。

首先,假设if (err)子句没有相同的return reply(output)语句,这意味着无论return(output)是异步的,您的代码都会始终执行Unit.findById 。也就是说,代码不会等待Unit.findById的响应完成,只要它调用它,代码就会继续并最终点击return语句。

其次,Owner.findOne在回调函数的代码块中应该有自己的return语句,因为代码只会在其中传播。

因此,对于Happy.findOne和Unit.findById成功执行的快乐路径案例,您仍会收到output.success = false的回复。

因此,忽略代码可读性,解决问题 - 您的代码看起来应该是这样的。

Unit.findById(request.payload.deviceNumber, function(err, device) {
    if (err) {
        //blah blah blah
        output.success = false;
        return reply(output);
    }
    if (device) {
       Owner.findOne({OwnerId: device.Owner}, function(err, Owner) {
           if (err) {
              //blah blah blah
              output.success = false;
              return reply(output);
           }
           else if (Owner){
               //make changes to output.operations
           }
           output.success = true;
           return reply(output);
       });
   } else {
       output.success = false;
       return reply(output); 
   }

});

答案 1 :(得分:0)

Owner.findOne是另一个异步函数,因此您需要将reply(output)移动到output.success = false;的else块中,并在{{{}}的回调中添加另一个reply(output)调用1}}。

在您的代码中Owner.findOne被称为之前执行return reply(output)的异步回调。此外,您不需要Owner.findOne,因为您无法使用return从这些回调中返回值,return仅退出该处的函数。

return