簡體   English   中英

HTTP請求的Node.js異步返回

[英]Node.js Asynchronous return from HTTP request

我對JS和Node非常陌生。 我試圖從異步http請求返回一個變量,並且我認識到問題出在調用的異步性質上,但是盡管閱讀了多個教程,卻無法弄清楚如何制作一個非常簡單的代碼片段功能。

有人可以將其標記為可以工作,我可以對其進行消化和修改以供自己使用嗎? 我應該使用異步庫嗎? 我已經嘗試了兩次,但仍無法完成這項工作。

 var request = require('request'); a = 0; a = foo(); function foo() { var num = 1; request('http://www.google.com', function (error, response, body) { // console.log('error:', error); // Print the error if one occurred //console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received //console.log('body:', body); // Print the HTML for the Google homepage. num = 3; return callback(num); }) return num; } console.log(a); 

您必須/只能在其回調內處理異步調用的結果,因為

  1. 回調不返回值,
  2. 回調無法訪問您周圍的上下文,因此在您的示例中,觸發回調時未定義num ,並且
  3. 您不知道回調何時完成,因此其結果可用。

在您的示例代碼中,foo將始終立即返回1而不管從request返回的響應/正文如何。

因此,我將假設您正確地提出了請求,而將重點放在回調的概念上。 如果您嘗試此操作,但仍需要更多幫助,請告訴我。

我將嘗試使此代碼與您已有的代碼保持接近:

function foo(callback){
   request('http://www.google.com', function (error, response, body) {
      if(error)
        console.log(error);
      //console.log('statusCode:', response && response.statusCode); 
      // Print the response status code if a response was received
      //console.log('body:', body); // Print the HTML for the Google homepage.
      num = 3;
      callback(num);
    })
}

然后要打印3,您需要執行以下操作。

foo(function(value){
   console.log(value);
})

在這種情況下,您將看到打印出的值3。

如果要返回更多,則只需3,就需要將它們作為參數傳遞給已傳入的回調函數。如果嘗試遵循回調樣式,則可能會更接近此值。

function foo(callback){
   request('http://www.google.com', function (error, response, body) {
     if(error)
        callback(error,null);
     //do what ever you need to with the response and body
     num = 3;
     callback(null,num);
    })
} 
foo(function(err, value){
   if(err)
      console.log(err);
   console.log(value);
})

您只需要記住,像Rob提到的那樣,回調通常不會返回。 相反,您可以讓函數調用傳入的另一個函數,並為該函數提供函數確定的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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