Javascript函数在nodejs中返回未定义的值

时间:2016-02-10 06:30:00

标签: javascript node.js javascript-events callback asynccallback

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

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;
}

1 个答案:

答案 0 :(得分:26)

  

而不是return,您应该使用callbacks,因为在asynchronous操作中,return不等待I/O操作完成。

Callback - 在JavaScript中,高阶函数可以作为函数中的参数传递。由于JavaSCript是单线程,因此一次只发生一个操作,每个将要发生的操作都在单个线程中排队。这样,当完成其余的父函数操作(async)并且脚本可以在等待结果时继续执行时,可以执行传递的函数(作为参数)。

通常这个callback函数作为函数中的最后一个参数传入。

使用Callbacks

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);
    }
  });
}