簡體   English   中英

等待請求完成Node.js

[英]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模塊。 在這種情況下,您可以使用promisescallbacks 這是一個帶回調的解決方案。

返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM