簡體   English   中英

無法將函數的結果傳遞給node.js中的全局范圍

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM