簡體   English   中英

使用從請求返回的“正文”

[英]Using 'body' returned from Request

我正在使用https://github.com/request/request

給出的例子是:

const request = require('request');

request('http://www.google.com', function (error, response, body) {
   console.error('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.
});

如何在代碼的其他地方使用body 我想要return body之類的東西,但沒有任何效果。 我不能在任何地方使用它!

您不能直接從request()回調外部返回異步結果。 這不是這個特定的 function 所獨有的,而是所有異步回調在 Javascript 中的工作方式。

當您調用request()時,它會啟動一個異步操作並將其轉換為本機代碼。 然后,JS 解釋器在此 function 調用之后(不在回調中,但在那之后)以愉快的方式執行 Javscript 的 rest。 因此,您應該能夠立即看到body結果還不存在,但是您的 Javascript 的 rest 已經在執行。

然后,一段時間后(取決於您正在聯系的服務器的響應速度以及結果的大小),當 JS 解釋器無事可做時,回調被調用並且body結果可用。

因此,您知道body結果良好且可用的代碼中唯一的位置是在該回調內部。 因此,在 Javascript 中使用這樣的異步操作進行編程的一般方法是在回調中使用結果。 任何需要使用該結果的代碼都放在該回調中,或者您可以將代碼放在單獨的 function 中並從回調中調用 function 並將body結果作為參數傳遞給 ZC1C425268E68385D1AB507A49。

如果您想將此請求包裝在 function 中並將該結果傳達給調用者(這與您在此處顯示的內容不同,而是另一種編寫代碼的方式),我建議您先閱讀如何返回響應來自異步調用? 因為它概述了您可以通過異步操作(另一個回調或使用承諾)將body結果傳達回的各種方式。


對於許多新手 Javascript 開發人員來說,這似乎有些異端。 你是什么意思我不能只調用 function,得到結果並從 function 返回? 嗯,這就是完全由事件驅動的 Javascript 非阻塞異步 I/O model 的額外復雜性。 一旦你走下學習曲線,你會發現這種架構 model 所帶來的語言的大量優勢,但你將不得不處理這個額外的復雜性。

該語言正在不斷發展,通過在async函數中使用 Promise,然后在 promise 上使用await來“等待”,從而使這種類型的編程變得更簡單。 如果你使用request-promise庫而不是request庫(request-promise 是從 request 派生的),那么你可以處理一個 promise 作為返回值,你有更多的選擇。

const rp = require('request-promise');

async getMeSomeData() {
    try {
        let body = await rp('http://www.google.com');
        console.log(body);

        // can put code here that uses body

        return body;         // becomes the resolved value of the returned promise

    } catch(err) {
        console.log(err);
        throw err;           // makes sure the returned promise is rejected
    }   
});

getMeSomeData().then(body => {
    // use the body here
}).catch(err => {
    // error here
});

注意:我展示了可能在getMeSomeData()或調用者處使用body值或err 通常,你會做其中一種,但我想展示兩種方式。

暫無
暫無

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

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