不能在node.js中使用返回值

时间:2018-01-26 07:30:03

标签: node.js function variables callback

此函数返回持续时间:

getEventLog.getId(uuid, function(err, id){
    if(err) return console.log(err)
    getEventLog.getDuration(id, function(err, duration, callback){
        if(err) return console.log(err)

    })
  });

如果我在console.log(duration)下面添加if(err) return callback(duration),我可以看到它的价值。

我想在其他函数中使用它作为变量。我尝试将整个函数设置为这样的值:

var duration = getEventLog.getId(uuid, function(err, id){
    if(err) return console.log(err)
        getEventLog.getDuration(id, function(err, duration, callback){
            if(err) console.log(err)
            control.log(duration)
        })
    });

虽然没用。然后我认为回调可能是方式,但不能让一个工作。这是我的尝试:

getEventLog.getId(uuid, function(err, id, callback){
     if(err) return console.log(err)
        getEventLog.getDuration(id, function(err, duration, callback){
            if(err) console.log(err)
            callback(duration)
        })
    });

如何更改此设置以便我可以使用持续时间值?

其他信息

如果我尝试回电话,我有

getEventLog.getId(uuid, function(err, id, callback){
    if(err) return console.log(err)
    getEventLog.getDuration(id, function(err, duration){
        if(err)
        var dur = duration
        callback(dur)
    })
});

var myVal = getEventLog.getId(function(dur) {
  console.log("myVal: " + dur)
});

我明白了:

  

模块/ getEventLog.js:36               callback(null,arrFound);               ^

     

TypeError:回调不是函数

如果我尝试返回,我会得到:

  getEventLog.getId(uuid, function(err, id, callback){
    if(err) return console.log(err)
    getEventLog.getDuration(id, function(err, duration){
        if(err) return duration
    })
  });

var myVal = getEventLog.getId()
console.log("myVal: " + myVal)

我也得到:

  

模块/ getEventLog.js:36               callback(null,arrFound);               ^

     

TypeError:回调不是函数

我认为删除return console.log(err)后可能会抛出它。

为愚蠢的问题道歉,但我是Node.js的新手。我哪里错了?

我在下面包含了getEventLog以供参考:

var http = require("http");
var fs = require('fs');
var async = require('async');
var readline = require('readline')
//var db = require('./dbPool');

//get file name
var options =  {
    "method" : "GET",
    "hostname" : "127.0.0.1",
    "port" : "18080",
    "path" : "/api/v1/applications/"
};

exports.getId = function (uuid, callback) {
    var req = http.request(options, function (res) {

        var chunks = [];

        res.on("data", function (chunk) {
            chunks.push(chunk);
        });

        res.on("end", function () {
            var body = JSON.parse(Buffer.concat(chunks));

            var arrFound = Object.keys(body).filter(function(key) {
                if (body[key].name.indexOf(uuid) > -1) { 
                    return body[key].name;
                }
            }).reduce(function(obj, key){
                obj = body[key].id;
                return obj;
            }, {});
            callback(null, arrFound);
        });
    });
    req.end();
}

exports.getDuration = function (myId, callback) {
    //getEventLog.getId(function(err, id){

    //get file name
    var options =  {
        "method" : "GET",
        "hostname" : "127.0.0.1",
        "port" : "18080",
        "path" : "/api/v1/applications/" + myId
    };

    var req = http.request(options, function (res) {
        console.log(options)

        var chunks = [];

        res.on("data", function (chunk) {
            chunks.push(chunk);
        });

        res.on("end", function () {
            var body = JSON.parse(Buffer.concat(chunks));

            var attempts = body.attempts

            var arrFound = Object.keys(body).filter(function(key) {

                return attempts[0].duration;

            }).reduce(function(obj, key){
                obj = body.attempts[0].duration;
                return obj;
            }, {});
            //console.log(arrFound);
            callback(null, arrFound);
        });
    });
    req.end();
 //   })
};

1 个答案:

答案 0 :(得分:0)

你应该重新思考你想要达到的目标。您描述,您想要一个返回值,但不要return任何东西。你执行一个回调函数(也没关系)。

函数可以返回如下值:

function foo() {
    return 'bar';
}

var value = foo(); // value === 'bar'

或者您可以执行回调函数(主要是异步)并将“返回值”作为参数放入其中,因此:

function foo(callback) {
    // do some stuff here
    var duration = 123;
    callback(duration);
)

// executing foo, putting a callback function into it
foo(function(duration)) {
    // duration will be 123 here
});

编辑:请注意,您应始终只显示代码的最低限度,这是了解问题所必需的。 你实际上正在思考和编码,但是你的函数调用是错误的(在编辑之前我才知道)。

getEventLog.getId(uuid, function(err, id, callback){
    if(err) return console.log(err)
    getEventLog.getDuration(id, function(err, duration){
        if(err)
        var dur = duration
        callback(dur)
    })
});


/* 
 * take a look at this line: 
 * your function requires your first parameter to be an `uuid`, 
 * but you simply skipped it. Now your second parameter is null, 
 * resulting in "callback is not a function"-error.
 */
var myVal = getEventLog.getId(function(dur) {
  console.log("myVal: " + dur)
});

只需将uuid作为第一个参数并将callback函数作为第二个参数传递,即可正确调用您的函数。