[英]Wait for request to finish Node.js
我目前在確定如何在返回任何數據之前等待請求完成時遇到問題。 我不相信我可以用回調做到這一點,我無法找到一個使用EventEmitter來做到這一點的好方法。 我無法使用回調的原因是因為我的流程目前是這樣的。
請求進入服務器>生成XML>聯系遠程API以獲取詳細信息以完成生成XML>完成生成XML>將請求返回給客戶端
我目前的代碼看起來非常類似於下面的代碼。
網絡服務器:
var xml = require('./XMLGenerator');
response.writeHead(200, {'Content-Type': 'text/xml'});
response.write(xml.generateXML());
response.end();
XML生成器:
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秒鍾才能完成,並且該節點在請求完成之前繼續運行。
你需要使用回調。 將您的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();
});
由於request
是異步的, 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;
...
您無法從async
調用return
,這是您的情況下的request
模塊。 在這種情況下,您可以使用promises或callbacks
。 這是一個帶回調的解決方案。
返回undefined
的實際問題是它不等待var response = API.getItems("5");
完全執行並執行下一行,因此您得到undefined
response
。 我希望你明白這一點。
我也希望
response.writeHead(200, {'Content-Type': 'text/xml'});
response.write(xml.generateXML());
response.end();
在某些API或http.createServer
回調中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.