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

        });

    }
};

最佳答案

代码中有几个问题。

首先,假设if (err)子句没有相同的return reply(output)语句,这意味着您的代码将始终执行return(output),因为Unit.findById是异步的。也就是说,代码不会等待Unit.findById的响应完成,并且一旦调用它,代码将继续运行并最终命中return语句。

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

因此,对于Owner.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);
   }


});

关于javascript - 从嵌套函数回来,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38421430/

10-11 17:14