等待请求完成Node.js

时间:2015-05-22 06:28:24

标签: javascript xml node.js

我目前在确定如何在返回任何数据之前等待请求完成时遇到问题。我不相信我可以用回调做到这一点,我无法找到一个使用EventEmitter来做到这一点的好方法。我无法使用回调的原因是因为我的流程目前是这样的。

  

请求进入服务器>生成XML>联系远程API   完成生成XML的细节>完成生成XML>返回   请求客户

我目前的代码与下面的代码非常相似。

Web服务器:

var xml = require('./XMLGenerator');
response.writeHead(200, {'Content-Type': 'text/xml'});
response.write(xml.generateXML());
response.end();

XML Generator:

function generateXML(){
// Code to generate XML
var API = require('./API');
var response = API.getItems("5");
for(var i = 1; i <= response.length; i++)
{
  // more code to generate further XML using the API response
}

// Finish generating and return the XML
}

API Grabber:

function getItems(sort_by, amount) {
var request = require("request")

var url = "https://url.com/api/get_items.json?amount=" + amount;
request({
    url: url,
    json: true
}, function (error, response, body) {
    console.log('we got here!');
   if (!error && response.statusCode === 200) {
        var items = body.data.items;
        console.log(items);

        return items;
    } else {
        console.log("Error connecting to the API: " + url);
        return;
    }
})
}

运行代码并直接测试时,返回“undefined”,表示请求尚未生成。我只需要知道一种方法,让XML生成器在继续生成之前等待请求完成。 (我输入的psudeo代码中可能存在轻微错误,因为它不是来自源的精确复制粘贴,但它在此流程中有效)

我只是使用不良做法,还是这是我尝试这种做法的正确方法?

编辑:问题是没有加载模块/ API文件,加载完全正常。问题是请求大约需要2秒钟才能完成,并且该节点会在请求完成之前继续运行。

2 个答案:

答案 0 :(得分:6)

您需要使用回调。将您的API抓取器更改为:

function getItems(amount, callback) {
// some code... 
request({
  url: url,
  json: true
}, function (error, response, body) {
   // some code...
   if (!error && response.statusCode === 200) {
      // some code    
      callback(items); <-- pass items to the callback to "return" it
   }
})
}

然后更改xml生成器以接受回调:

function generateXML(callback){
// Code to generate XML
var API = require('./API');
API.getItems("5",function(response){
  for(var i = 1; i <= response.length; i++)
  {
    // more code to generate further XML using the API response
  }

  // Finish generating and return the XML
  callback(xml_result); // <-- again, "return" the result via callback
});
}

然后在您的服务器代码中执行:

var xml = require('./XMLGenerator');
response.writeHead(200, {'Content-Type': 'text/xml'});
xml.generateXML(function(xmlstring){
    response.write(xmlstring);
    response.end();
});

答案 1 :(得分:1)

request异步后执行这些更改,请使用回调。

API.getItems("5", function(rs){
      var response = rs;
      for(var i = 1; i <= response.length; i++)
      {
      // more code to generate further XML using the API response
      }

      // Finish generating and return the XML
    }

});


...
function getItems(sort_by, amount, callback) {...

...
callback(items); //Instead of return items;

...

return来电asyncrequest模块,callbacks。在这种情况下,您可以使用 promises undefined。这是一个带回调的解决方案。

返回var response = API.getItems("5");的实际问​​题是它不会等待response完全执行并执行下一行,因此undefinedresponse.writeHead(200, {'Content-Type': 'text/xml'}); response.write(xml.generateXML()); response.end(); 。我希望你明白这一点。\

我也希望

http.createServer

位于API或myMedsList.name[indexPath.row]的某些回调中。