2017-03-14 30 views
0

私はこのループを数日間は困惑していました。配列内のオブジェクトに新しい要素を追加する

検索結果の配列(mdb_results)をループし、各オブジェクトから.nameを抽出し、Google CSEイメージ検索で_searchという用語として使用します。

Th CSEは、_searchという用語(mdb_results[i])を抽出したオブジェクトに追加したい別の配列(cse)を返します。

router.get('/json', function(req, res, next) { 
var ImageSearch = require('node-google-image-search'); 
MongoClient.connect(url, function(err,db){ 
    db.collection('mycatalog') 
    .find({$text: {$search:"FOO" }}) 
    .toArray(function(err, mdb_results){  
     for (var i=0; i<mdb_results.length; i++){   
      var _search = mdb_results[i].name ; 

      ImageSearch(_search, function(cse){ 

       // How to add cse.img to mdb_results[i].images ?? 
       // mdb_results[i].images = cse; 
       // gives undefined 

      },0,2); 
     }; 
     res.send(mdb_results); 
     }); 
    }); 
}); 

私の初期mdb_resultsはこのように見えます。

私はこのような何かを達成しようとしている
[{"name":"FOO"},{"name":"FOOOO"}] 

[{"name":"FOO", 
    "images":[{"img1":"http://thumbnail1"},{"img2":"http://thumbnail2"}] 
}, 
{"name":"FOOOO", 
    "images":[{"img1":"http://thumbnaila"},{"img2":"http://thumbnailb"}] 
}] 

誰もがこれを達成するためにどのように私を見ることができますか?あなたが約束またはasyncライブラリを使用する必要があるとしている

router.get('/json', function(req, res, next) { 
var ImageSearch = require('node-google-image-search'); 
MongoClient.connect(url, function(err,db){ 
    db.collection('mycatalog') 
    .find({$text: {$search:"FOO" }}) 
    .toArray(function(err, mdb_results){  
     for (var i=0; i<mdb_results.length; i++){   
      var _search = mdb_results[i].name ; 
      // This search is asynchronous, it won't have returned by the time 
      // you return the result below. 
      ImageSearch(_search, function(cse){ 

       // How to add cse.img to mdb_results[i].images ?? 
       // mdb_results[i].images = cse; 
       // gives undefined 

      },0,2); 
     }; 
     // At this point, ImageSearch has been called, but has not returned results. 
     res.send(mdb_results); 
     }); 
    }); 
}); 

おかげ

答えて

1

問題は、非同期操作が同期動作するように期待しているということです。ありがとう - これは動作し、私はあなたの答えを受け入れ

router.get('/json', function(req, res, next) { 
var ImageSearch = require('node-google-image-search'); 
MongoClient.connect(url, function(err,db){ 
    db.collection('mycatalog') 
    .find({$text: {$search:"FOO" }}) 
    .toArray(function(err, mdb_results){ 
     // async.forEach will iterate through an array and perform an asynchronous action. 
     // It waits for you to call callback() to indicate that you are done 
     // rather than waiting for it to execute synchronously. 
     async.forEach(mdb_results, function (result, callback) { 
      ImageSearch(result.name, function(cse){ 
       // This code doesn't get executed until the network call returns results. 
       result.images = cse; 
       // This indicate that you are done with this iteration. 
       return callback(); 
      },0,2); 
     }, 
     // This gets call once callback() is called for each element in the array, 
     // so this only gets fired after ImageSearch returns you results. 
     function (err) { 
      res.send(mdb_results); 
     }); 
    }); 
}); 
+0

は、ここでの例です。 'cb'で何が起こっているのか少し詳しくお考えですか?それにもかかわらず、私は何が起こっているのか理解するのに苦労しています。 – Colin

+0

私は精巧にしようとするために投稿を更新しました。 NodeJSでコールバックがどのように機能するかを理解することは、ここで何が起こっているのかを理解する上で非常に重要です。コールバックは、作業が終了したことを示すために使用されます。 – EmptyArsenal

+0

注釈をありがとう。私はまだ自分自身の呼び出しであると思われる 'return callback()'と闘っていますか?私たちは 'callback'を囲み関数に渡し、' callback'のための関数定義なしでそれを呼び出します。答えが複雑すぎてコメントできない場合は、自分で教えることができるリソースをおすすめできますか? – Colin

関連する問題