快速路由和异步代码 - 如何发送异步代码的结果?
的我想要实现一个简单的提纲:快速路由和异步代码 - 如何发送异步代码的结果?
- 一个AJAX调用到特定的URL进行的服务器上
- 表达路线(以“app.js”),然后运行节点“Send.js”中的.js代码
- “Send.js”的输出用作“res.send”方法对AJAX请求的响应。
我的问题是,“Send.js”利用异步方法等的“回应”变量我试图返回“res.send(响应)”没有定义当响应发送,因为“Send.js”中的“sendOn”函数在异步代码执行之前完成,当然。
我知道使用回调很可能是这里的解决方案,所以“res.send(response)”不会被调用,直到定义了响应,我不知道如何实现,这里两个独立的文件:
app.js(简化):
var send = require("./Files/Other/Send.js");
app.post('/Lamp-On', function (req, res)
{
var response = send.sendOn();
res.send(response);
});
Send.js(简化):
client.open和client.sendEvent是接受一个回调既是异步方法最后一个参数,并且是外部SDK的一部分。
var sendMessage = function()
{
var data = "on";
var message = new Message(data);
message.properties.add('Turn On');
console.log('Sending message to turn the lamp: ' + message.getData());
client.sendEvent(message, printResultFor('Message'));
};
var connectCallback = function() {
if (err) {
console.error('Could not connect: ' + err.message);
}
else {
console.log('Client connected');
client.on('message', function (msg) {
console.log('Id: ' + msg.messageId + ' Body: ' + msg.data);
client.complete(msg, printResultFor('completed'));
// reject and abandon follow the same pattern.
// /!\ reject and abandon are not available with MQTT
});
client.on('error', function (err) {
console.error(err.message);
});
client.on('disconnect', function() {
clearInterval(sendInterval);
client.removeAllListeners();
client.connect(connectCallback);
});
// Now call the sendMessage function.
sendMessage();
}
};
var sendOn = function() {
client.open(connectCallback);
return
};
// Helper function to print results in the console
function printResultFor(op) {
return function printResult(err, res) {
if (err !== null) {
console.log(op + ' error: ' + err.toString());
console.log(err);
}
if (res) {
console.log(op + ' status: ' + res.constructor.name);
};
};
}
exports.sendOn = sendOn;
我只是不怎么处理这么多的异步回调!
最后注意:我既不问也不指望任何人为我做这件事,但我希望你能指点我正确的方向,事先要感谢。
的唯一方法返回的值是通过回调。即使你使用承诺也是如此。
回调是你如何返回一个值。因此,因为sendOn()
需要返回一个值,它需要接受回调(或者返回一个承诺,承诺将接受回调)。
基本上app.js
应该是这样的:
app.post('/Lamp-On', function (req, res)
{
send.sendOn(function(err,response){
res.send(response);
});
});
一个你需要的东西习惯的功能是停止思考的子程序。而是将功能看作控制结构,如for
或while
或if
。你用来编写类似的代码:
if (something) {
something_else();
}
从概念上讲,你那么不应该有太多的麻烦:
doIf(something,function(){
something_else();
});
现在到了有趣的部分。如何使sendOn()
接受回调?只要将该回调一直传递给“返回”结果的函数即可。基本上,这个过程从程序编程倒,而不是一路返回值外码你通过代码一路值:
var sendOn = function (callback) {
client.open(function(){
connectCallback(callback); // pass the CODE down to the value
});
};
var connectCallback = function (callback) {
if (err) {
callback(err);
}
else {
client.on('message', function (msg) {
console.log('Id: ' + msg.messageId + ' Body: ' + msg.data);
callback(null, msg.data); // Now pass the value to the CODE
});
sendMessage();
}
};
我假设msg.data
是结果。如果不相应更改。确保您将结果传递给您从sendOn()
一路下降的回调。
这真是太棒了,谢谢你简化和解释清楚! – Sam3000
从我的角度来看,以及我前几天学到的东西,只要在sendMessage函数内添加你想要做的任何事情(如果可能的话)就可以工作。由于beeing JavaScript res对象应该从那里访问。
有关回调进一步提示和callbackhell:http://callbackhell.com/
感谢您的链接 – Sam3000
我的建议是使用[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)来处理异步调用,您将能够这样做'send.sendOn()。then(function(response){res.send(response);});' –
我建议使用'async'模块来避免这个问题'https://github.com/caolan/async' – abdulbarik