2016-08-17 1 views
0

私はCat情報を保存するスキーマを持っています。 :私はそのようにCat.find()呼び出しcat_urls内でこのような値を持っている私はDBSコールの外に配列を呼び出すときただし、アレイはdbs呼び出し後に配列変数が保存されないのはなぜですか?ノードjs

var cat_urls = []; 

Cat.find(function (err, data) { 
    var stringify = JSON.stringify(data) 
    content = JSON.parse(stringify); 
    content.forEach(function (result) { 
     cat_urls.push(result.cat_url); 
    }) 
    console.log(cat_urls, 'here') 
}) 

console.log(cat_urls, 'here not working') // I want cat_urls to also be populated here 

空で、すべてのcat_urlsの配列を作成したいです

[ 'www.hello.co.uk', 'www.testing.co.uk' ] 'here' 

しかし、外cat_urls = []

私は、これはノードのJSが特定の順序で実行されないという事実に関係することだと思いますが、どのように私はこの問題を解決することができますか?

答えて

1

私はそれが動作していると思いますが、find関数は非同期に解決する約束を返します。

試してみてください。

var cat_urls = []; 

Cat.find(function (err, data) { 
    var stringify = JSON.stringify(data) 
    content = JSON.parse(stringify); 
    content.forEach(function (result) { 
     cat_urls.push(result.cat_url); 
    }) 
    console.log(cat_urls, 'here') 
}).then(function(){ 
    // Promise has completed, now this console log will trigger only after the cat's names are pushed. 
    console.log(cat_urls); 
}) 
+0

しかし、その目的は、その関数のこの外側を呼び出すことができるようにすることです - 配列ではなく、空の –

+0

@emisqweより移入されて残念ながら約束の性質は、それらを解決しなければならないようなものですグローバル変数が設定されていることを保証することができます。実行する必要がある場合は、 '.then(function(){}) 'ステートメント内の関数に囲むか、そのステートメント内の他の関数を呼び出すことさえできます。 Mongoose http://mongoosejs.com/docs/promises.htmlでの約束やその仕組みを理解するのに役立つ記事があります。 – Mike

関連する問題