我正在使用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
的东西,但没有任何效果。我无法在任何地方使用它!
答案 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
。通常,您会选择其中一种,但我想同时展示两种方式。