2016-12-02 11 views
1

私はimages-scraperパッケージを使用してnode.jsを検索しています。パッケージは結果の配列を正しく返します。その配列の1つの要素(画像のURL)をグローバルスコープ経由で別のパッケージで使用できる変数に渡そうとしています。ここで関数の結果をnode.jsのグローバルスコープに渡すことができません

は私のコードです:

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は未定義です。関数の外部でその結果にどのようにアクセスできるかについてのアドバイスはありますか?グローバルスコープを使用すべきでない場合は、どのような方法が最適ですか?前もって感謝します。

答えて

1

あなたの問題はまだグローバルが設定されていないことにあります。 bing.list(...).then(...)は約束を返し、したがって非同期です。このため、あなたのグローバルはスコープの外ではまだ宣言されていません。あなたのコンソールログは、あなたが期待していた順序から外れるので、あなたのグローバルがまだ宣言されていないことを伝えることができます。彼らが起こった順序は事故ではなく、約束が作成された方法なので、あなたが今作ったような将来の間違いを避けるためにそれらについてもっと学ぶ必要があります。

私は、約束herehere、および他の場所についてお読みになります。

しかし、私はグローバル設定の代わりにモジュールのエクスポートを使用します。これは私の意見ではもっと良い方法です。モジュールのエクスポートでは、変数と関数をあるファイルから別のファイルにエクスポートできます。それらは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。必要なパスを変更するだけでよいわけではありません。)

var imageScraper = require('./image_scraper'); 

imageScraper.bing("Mario").then(function (url_result) { 
    console.log("url_result", url_result); 
}); 
+1

これは素晴らしいことですよりよいアプローチと同様に私の問題を説明する時間を与えてくれました。モジュールのエクスポートがまったく発生していないので、このアプローチでは – Gideon

+0

@Gideonを読んでみましょう。コマンドラインに慣れていれば、nodeschool.ioからlearnyounodeチュートリアルを試すことができます。 https://nodeschool.io – John

1

グローバル変数を正しく設定していますが、操作の順序に問題があります。関数内に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); 
} 
関連する問題