使用请求中返回的“ body”

时间:2019-11-18 22:14:31

标签: node.js

我正在使用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的东西,但没有任何效果。我无法在任何地方使用它!

1 个答案:

答案 0 :(得分:0)

您不能直接从request()回调外部返回异步结果。这不是此特定功能的唯一功能,而是所有异步回调在Javascript中的工作方式。

调用request()时,它将启动异步操作并将其转换为本地代码。然后,JS解释器会以一种很有趣的方式在此函数调用之后(不在回调函数中,而是在回调函数之后)执行其余Javscript。因此,您应该能够立即看到body结果尚不存在,但是您的Javascript的其余部分已经在执行。

然后,在一段不确定的时间之后(取决于您正在联系的服务器的响应速度以及结果的大小),当JS解释器无事可做时,将调用回调并{{1} }结果可用。

因此,在您的代码中唯一知道body结果是好的并且可以在回调内使用的地方。因此,使用Javascript这样的异步操作进行编程的一般方法是在回调中使用结果。任何需要使用该结果的代码都将放入该回调中,或者您可以将该代码放入一个单独的函数中,然后从回调内部调用该函数,并将body结果作为参数传递给该函数。

如果您想将此请求包装在函数中,然后将结果传达给调用方(这与您在此处显示的不完全相同,而是另一种编写代码的方式),建议您先阅读{{3 }},因为它概述了您可以通过异步操作(另一个回调或使用Promise)回传body结果的各种方式。


对于许多新手Java开发人员来说,这似乎有些异端。您是什么意思,我不能只调用一个函数,获取结果并从该函数返回它?好吧,这是完全由事件驱动的Javascripts非阻塞,异步I / O模型带来的额外麻烦。一旦走上了学习的道路,您将发现这种体系结构模型所带来的语言方面的巨大优势,但是您将不得不应对这种额外的复杂性。

语言正在发展,通过在body函数中使用诺言,然后使用async在诺言中“等待”,使这种类型的编程变得更简单。如果您使用await库而不是request-promise库(请求是从请求派生的),则可以将promise作为返回值处理,并且有更多选择。

request

注意:我展示了可能在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 }); 内部或在调用方使用body值或err。通常,您会选择其中一种,但我想同时展示两种方式。