我目前在确定如何在返回任何数据之前等待请求完成时遇到问题。我不相信我可以用回调做到这一点,我无法找到一个使用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秒钟才能完成,并且该节点会在请求完成之前继续运行。
答案 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
来电async
,request
模块,callbacks
。在这种情况下,您可以使用 promises 或undefined
。这是一个带回调的解决方案。
返回var response = API.getItems("5");
的实际问题是它不会等待response
完全执行并执行下一行,因此undefined
为response.writeHead(200, {'Content-Type': 'text/xml'});
response.write(xml.generateXML());
response.end();
。我希望你明白这一点。\
我也希望
http.createServer
位于API或myMedsList.name[indexPath.row]
的某些回调中。