Javascript 无法将函数的结果传递到node.js中的全局作用域
我使用node.js包搜索与给定搜索字符串相关的图像。包将正确返回结果数组。我试图将该数组的一个元素(图像的url)传递给一个变量,该变量可以通过全局作用域在另一个包中使用 这是我的密码:Javascript 无法将函数的结果传递到node.js中的全局作用域,javascript,node.js,scope,web-scraping,Javascript,Node.js,Scope,Web Scraping,我使用node.js包搜索与给定搜索字符串相关的图像。包将正确返回结果数组。我试图将该数组的一个元素(图像的url)传递给一个变量,该变量可以通过全局作用域在另一个包中使用 这是我的密码: var Scraper = require ('images-scraper') , bing = new Scraper.Bing(); bing.list({ keyword: 'search string here', num: 1, detail: true }) .th
var Scraper = require ('images-scraper')
, bing = new Scraper.Bing();
bing.list({
keyword: 'search string here',
num: 1,
detail: true
})
.then(function (res) {
console.log('url of image result', res[0]['url']);
global.url_result = res[0]['url'];
}).catch(function(err) {
console.log('err',err);
})
console.log('array',global.url_result);
软件包工作-当被告知将图像打印到函数内的控制台时,控制台从
res[0]['URL']
返回图像的URL,但是函数外的控制台日志返回未定义的global.URL\u result
。关于我如何在功能之外获得该结果,有什么建议吗?如果我不应该使用全局范围,那么最好的方法是什么?提前感谢。您正确设置了全局变量,但存在操作顺序问题。您正在then函数中设置global.url_result,因此它发生在承诺完成之后,因此console.log在设置变量之前触发。如果您将日志包装到一个函数中,然后在then函数中调用它,那么就可以工作了
.then(function (res) {
console.log('url of image result', res[0]['url']);
global.url_result = res[0]['url'];
loggerFunc();
}
var loggerFunc() {
console.log(global.url_result);
}
你的问题在于全球气候变化尚未确定。您的
bing.list(…)。然后(…)
返回一个承诺,因此是异步的。因此,尚未在范围外声明全局。您可以看出,您的全局日志尚未声明,因为您的控制台日志发生的顺序与您预期的顺序不符。但是,它们发生的顺序并不是灾难,而是承诺产生的方式,所以你需要更多地了解它们,以避免将来犯下像你刚刚犯的那样的错误
我会读一些关于承诺和其他地方的书
但我会使用模块导出,而不是设置全局,我认为这是更好的做法。模块导出允许您将变量和函数从一个文件导出到另一个文件。它们设置为module.exports=myVariable
。然后,可以使用require
功能将它们拉入服务器上的其他文件中。请注意,如果是未安装npm的模块,则必须使用相对目录。相对路径以代表当前目录的点开始,然后遵循常规路径约定
在你的情况下,我会这样做:
文件image\u scraper.js中的代码
var Scraper = require ('images-scraper')
, bing = new Scraper.Bing();
function scrapeBing (searchString) {
return bing.list({
keyword: searchString,
num: 1,
detail: true
})
.then(function (res) {
console.log('url of image result', res[0]['url']);
return res[0]['url']
}).catch(function(err) {
console.log('err',err);
})
}
module.exports = {
bing: scrapeBing
};
文件app.js中的代码(它与image\u.js位于同一个目录中。不必如此,您只需更改所需路径即可。)
非常感谢您花时间解释我的问题以及更好的方法。根本没有遇到模块导出,所以我将详细阅读approach@Gideon如果您对命令行感到满意,可以尝试使用nodeschool.io中的learnyounode教程。
var imageScraper = require('./image_scraper');
imageScraper.bing("Mario").then(function (url_result) {
console.log("url_result", url_result);
});