2016-08-16 78 views
0

的我想要实现一个简单的提纲:快速路由和异步代码 - 如何发送异步代码的结果?

  1. 一个AJAX调用到特定的URL进行的服务器上
  2. 表达路线(以“app.js”),然后运行节点“Send.js”中的.js代码
  3. “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; 

我只是不怎么处理这么多的异步回调!

最后注意:我既不问也不指望任何人为我做这件事,但我希望你能指点我正确的方向,事先要感谢。

+0

我的建议是使用[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)来处理异步调用,您将能够这样做'send.sendOn()。then(function(response){res.send(response);});' –

+0

我建议使用'async'模块来避免这个问题'https://github.com/caolan/async' – abdulbarik

回答

1

的唯一方法返回的值是通过回调。即使你使用承诺也是如此。

回调是你如何返回一个值。因此,因为sendOn()需要返回一个值,它需要接受回调(或者返回一个承诺,承诺将接受回调)。

基本上app.js应该是这样的:

app.post('/Lamp-On', function (req, res) 
{ 
    send.sendOn(function(err,response){ 
     res.send(response); 
    }); 
}); 

一个你需要的东西习惯的功能是停止思考的子程序。而是将功能看作控制结构,如forwhileif。你用来编写类似的代码:

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()一路下降的回调。

+0

这真是太棒了,谢谢你简化和解释清楚! – Sam3000

1

从我的角度来看,以及我前几天学到的东西,只要在sendMessage函数内添加你想要做的任何事情(如果可能的话)就可以工作。由于beeing JavaScript res对象应该从那里访问。

有关回调进一步提示和callbackhell:http://callbackhell.com/

+0

感谢您的链接 – Sam3000