在Node.js中,JavaScript函数返回undefined值

14

我正在编写获取数据的代码。首先,我调用 **getsomedata** 函数来获取数据,在 getsomedata 函数内部,我调用另一个函数 getRandomdata 来获取数据并将其返回到上一个函数,但它返回了 undefined。但是在 getRandomdata 中,数据可以在 console.log 中看到。我需要使用回调函数吗?

router.get('/get-data', function (req, res, next) {
    var result = getsomedata(some_parameter);
    console.log(result);   // receiving undefined
    res.send(result);
});

function getsomedata(some_parameter_recieved) {
    var getsomedata = getRandomdata(random_params);
    console.log(getsomedata);    // receiving undefined
    return getsomedata;
}

function getRandomdata(random_params_recieved) {
    // after some calculation 
    console.log(random_data);           // receiving proper data
    return random_data;
}

5
欢迎来到“异步编程”!了解“回调函数”或“Promise”。 - Rayon
你可能需要从回调函数中返回值。请尝试这个链接:http://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/ - Jeff P Chacko
可能是以下问题的重复:如何从异步回调函数中返回值? - Gavriel
好的,你能否修改这段代码呢?因为这对我很紧急。如果可以的话,请尽快修改。 - iam
1个回答

35

在异步操作中,应该使用回调函数callbacks而不是return,因为return不会等待I/O操作完成。

回调函数 - 在 JavaScript 中,高阶函数可以作为参数传递给其他函数。由于 JavaScript 是单线程的,每次只能执行一个操作,并且每个操作都会在单个线程中排队。这样,当父函数的操作(async)完成并且脚本在等待结果时,传递的函数(作为参数)可以被执行。

通常,这个回调函数作为函数的最后一个参数传入。

使用回调函数

router.get('/get-data', function(req, res, next) {
  getsomedata(some_parameter, function(result) {
    console.log(result);
    res.send(result);
  });
});

function getsomedata(some_parameter_recieved, callback) {
  getRandomdata(random_params, function(random_data) {
    callback(random_data);
  });
}

function getRandomdata(random_params_recieved, callback) {
  // after some calculation
  callback(random_data);
}

使用 Promise

router.get('/get-data', function(req, res, next) {
  getsomedata(some_parameter, function(result) {
    console.log(result);
    res.send(result);
  });
});

function getsomedata(some_parameter_received, callback) {
  getRandomdata(random_params).then(function(random_data) {
    callback(random_data);
  }).catch(function(e) {
    //handle error here
  });
}

function getRandomdata(random_params_received, callback) {
  return new Promise(function(resolve, reject) {
    // after some calculation
    if (RandomDataGeneratedSuccessfully) {
      resolve(random_data);
    } else {
      reject(reason);
    }
  });
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接