[英]Unable to pass result of a function to global scope in node.js
我使用用於node.js的images-scraper包來搜索與給定搜索字符串有關的圖像。 程序包正確返回結果數組。 我正在嘗試將該數組的一個元素(圖像的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,但是函數外部的控制台日志將undefined返回global.url_result
。 關於如何在函數外部訪問該結果的任何建議? 如果我不應該使用全局范圍,最好的方法是什么? 提前致謝。
您正在正確設置全局變量,但是操作順序有問題。 您是在then函數中設置global.url_result的,所以它會在promise完成后發生,因此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(...).then(...)
返回一個promise,因此是異步的。 因此,尚未在范圍之外聲明您的全局變量。 您可以告訴您尚未聲明全局變量,因為您的控制台日志發生在您期望的順序之外。 它們發生的順序雖然不是偶然,而且是創建承諾的方式,所以您需要了解有關它們的更多信息,以避免將來犯的錯誤,例如您剛才犯的錯誤。
但是我認為使用模塊導出而不是設置全局變量是更好的做法。 模塊導出允許您將變量和函數從一個文件導出到另一個文件。 它們使用module.exports = myVariable
設置。 然后可以使用require
函數將它們拉入服務器上的其他文件。 請注意,如果不是npm安裝的模塊,則必須使用相對目錄。 相對路徑以代表當前目錄的點開始,然后遵循常規路徑約定。
這是我在您的情況下要做的:
文件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位於同一目錄中。不需要,您只需更改require路徑即可。)
var imageScraper = require('./image_scraper');
imageScraper.bing("Mario").then(function (url_result) {
console.log("url_result", url_result);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.