iam*_*iam 10 javascript callback javascript-events asynccallback node.js
我正在编写获取数据的代码.首先我调用**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;
}
Run Code Online (Sandbox Code Playgroud)
Ray*_*yon 28
而不是
return,你应该使用callbacks因为在asynchronous操作中,return不等待I/O操作完成.
Callback - 在JavaScript中,高阶函数可以作为函数中的参数传递.由于JavaSCript是单线程,因此一次只发生一个操作,每个将要发生的操作都在单个线程中排队.这样,当父函数operation(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);
}Run Code Online (Sandbox Code Playgroud)
使用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);
}
});
}Run Code Online (Sandbox Code Playgroud)