的我想要实现一个简单的提纲:快速路由和异步代码 - 如何发送异步代码的结果?
- 一个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;
我只是不怎么处理这么多的异步回调!
最后注意:我既不问也不指望任何人为我做这件事,但我希望你能指点我正确的方向,事先要感谢。
我的建议是使用[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