您可以永远从回调中返回值。
如果你在回调中得到一个值,你需要使用另一个回调来提取该值或当场使用它:你不能返回它。问题总是“好的,既然我有了这些数据,我想用它做什么?”而“退货”的答案是不可接受的。
例如,这应该可以工作:
var http = require('http');
var options = {
host: 'some.host.com',
path: '/some/path'
};
var useData = function(data) {
// do something
}
var callback = function(response) {
var raw = '';
response.on('data', function(d) {
raw += d;
});
response.on('end', function() {
var data = JSON.parse(raw);
useData(data);
});
};
http.request(options, callback).end()
(另外,这不是您的主要问题,但您有两个名为 data 的变量:var data 行中的一个本地变量,return 中的另一个全局变量。)
编辑:
我很困惑为什么我不能从回调中“返回”一个值。函数没有返回值/变量,或计算为一个值吗?
他们有,但为时已晚。类比时间。
同步:
玛莎让约翰接电话,然后耐心地等待对话结束。然后她问他是谁,他们想要什么。约翰说他们的邻居要一杯糖。她告诉他去给他们的邻居一杯糖。然后,她出去见她的朋友。
var reply = john.answerPhone();
var action = reply.figureOutResponse();
john.tellToDo(action);
错误的异步:
玛莎让约翰接电话,告诉她电话是什么,然后出去见她的朋友。她一离开家就试图处理约翰的回复——但约翰甚至还没有拿起听筒,更不用说告诉她任何事情了——所以她精神崩溃了。如果她试图阅读这张纸条,它仍然是一张白纸(即使我们忽略了它可能还在房子里的事实),所以她又一次崩溃了。如果有人还在乎,五分钟后约翰挂断了电话,宣布他的邻居需要糖到空屋子里,因为玛莎已经不在了。以防万一,他还给她写了一张便条。没人告诉他还能做什么,他拿起报纸开始浪费时间。便条永远不会被阅读。
var note;
var reply = john.answerPhone(function(reply) {
note = reply;
return reply;
};
note.figureOutResponse();
// Cannot read property 'figureOutResponse' of undefined
reply.figureOutResponse();
// Cannot read property 'figureOutResponse' of undefined
正确的异步:
玛莎让约翰接电话,然后给她回电话,因为她要出去见朋友。她出去了,约翰接起了电话。五分钟后,约翰打电话给玛莎的手机,说是邻居在找糖。她让他把杯子倒满,递给邻居,然后挂断电话,继续她的巴士之旅。
var marthasCellphone = function(data, respondCallback) {
var action = data.figureOutResponse();
respondCallback(action);
}
john.answerPhone(function(data) {
// callback here: no returns, pass data on to another callback
var action = marthasCellphone(data, function(action) {
// another callback here; use action immediately
john.tellToDo(action);
});
});
reply.figureOutResponse();