Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法将函数的结果传递到node.js中的全局作用域_Javascript_Node.js_Scope_Web Scraping - Fatal编程技术网

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

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

我使用node.js包搜索与给定搜索字符串相关的图像。包将正确返回结果数组。我试图将该数组的一个元素(图像的url)传递给一个变量,该变量可以通过全局作用域在另一个包中使用

这是我的密码:

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);
});