无法将函数的结果传递给node.js中的全局作用域

我正在使用image-scraper包的node.js来search与给定searchstring相关的图像。 该包会正确返回结果数组。 我试图将该数组的一个元素(图像的url)传递给一个variables,我可以通过全局范围在另一个包中使用该variables。

这是我的代码:

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_result 。 有关如何在函数之外实现对结果的访问的任何build议? 如果我不应该使用全球范围,最好的办法是什么? 提前致谢。

你的问题在于全球尚未设定。 你的bing.list(...).then(...)返回一个promise,因此是asynchronous的。 出于这个原因,你的全球范围还没有被宣布。 你可以告诉你的全局没有被声明,因为你的控制台日志发生了你所期望的命令。 他们发生的顺序虽然不是偶然事件,并且是创造诺言的方式,所以您需要进一步了解这些诺言以避免将来出现的错误,

我会在这里 , 在这里和其他一些地方读到承诺。

但是我会使用模块导出来代替设置全局variables,在我看来这是更好的做法。 模块导出允许您将variables和函数从一个文件导出到另一个文件。 他们与module.exports = myVariable设置。 然后可以使用require函数将它们拉到服务器上的其他文件中。 请注意,如果它是不是npm的模块,则必须使用相对目录。 相对path以表示当前目录的点开始,然后遵循常规path约定。

这是我会在你的情况下做的:

代码在文件image_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_scraper.js相同的目录下,不需要改变requirepath)

 var imageScraper = require('./image_scraper'); imageScraper.bing("Mario").then(function (url_result) { console.log("url_result", url_result); }); 

你正在设置全局variables,但你有一个操作顺序的问题。 你正在设置global.url_result在一个then函数中,所以它在promise完成之后发生,所以console.log在variables被设置之前触发。 如果你把你的日志包装在一个函数中,然后在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); }