2015-12-16 108 views
1
var TheMovieDb = require('themoviedb'); 
var moviedbClient = new TheMovieDb('*****'); 
var movieJson = require("./seedMovieDB/movieName.json"); 
var MovieEntry = require('./movie.model'); 
var movieApi = new TheMovieDb('1b3819c5f61aaef99edf4c47a5de46f4', 'en'); 
var P = require('bluebird'); 
var _ = require('underscore'); 
var moviedb = module.exports = { 
indexMovie : function indexMovie(){ 
      MovieEntry.removeAsync({}) 
      .then (function() { 
       _.each(movieJson, function(val, key, cb){ 
          movieApi.searchMovies(val.name).then (function(mDetails) { 
          if(mDetails !== undefined){ 
           _.each(mDetails , function(val, key, cb){ 
             var m = new MovieEntry({ 
              id: val.id, 
              title : val.title, 
              originalTitle : val.originalTitle, 
              year : val.year, 
              popularity : val.popularity, 
              voteAverage : val.voteAverage, 
              votes : val.votes, 
              isAdult : val.isAdult, 
              video : val.video, 
              poster : val.poster, 
              backdrop : val.backdrop,       
             }); 
             m.save(function(err, movie_saved){ 
              if(err){ 
               console.log(err); 
              }else{ 
               console.log("saved"); 
              } 
             }); 
           }) 
          }      
         }).catch(function(err){ 
          if(err){ 
           console.log(err); 
          } 
         }); 
       }); 
     }); 
} 

}承諾與_.each異步調用

我想回到一個承諾或什麼的,這將確保一旦我所有的電話每一個,那就是取得了ASYN searchMovie電話,都是過來,然後我可以使用.then()從數據庫中檢索我存儲在代碼中的東西。 我是新承諾,不知道如何做到這一點。 我有一個調用indexMovie函數的控制器,一旦調用結束,我想從數據庫中檢索保存的值。

回答

3

使用Promise.each代替_.each結束等待異步操作添加承諾()。完成(函數(){,如果操作不涉及使用Promise.map相反,所以他們可以同時執行。

首先 - 正確的解決方案是讓你的數據庫調用批量執行查詢,而不是查詢API100次100次,查詢一次movieApi.searchMovies(val.name)應該有一個movieApi.searchMovies(...arrr) alte對多個值起作用的名詞等等。

也就是說,主體部分就變成了:

return Promise.map(movieJson, x => searchMovies(x.name)).map(x => 
    new MovieEntry(val); 
).map(x => 
    x.save() 
).then(x => 
    console.log("All Done!") 
).catch(e => { 
    console.error("Error somewhere", e); 
    throw e; 
}); 
+0

您可以使用Promise.All API,這已經是這些情況的標準。而不是你的解決方案。 – Nirus

+0

@Nirus:OP是專門詢問藍鳥的,這沒有什麼錯 – Bergi

-2

只需在每個

var moviedb = module.exports = { 
indexMovie : function indexMovie(){ 
      MovieEntry.removeAsync({}) 
      .then (function() { 
       _.each(movieJson, function(val, key, cb){ 
          movieApi.searchMovies(val.name).then (function(mDetails) { 
          if(mDetails !== undefined){ 
           _.each(mDetails , function(val, key, cb){ 
             var m = new MovieEntry({ 
              id: val.id, 
              title : val.title, 
              originalTitle : val.originalTitle, 
              year : val.year, 
              popularity : val.popularity, 
              voteAverage : val.voteAverage, 
              votes : val.votes, 
              isAdult : val.isAdult, 
              video : val.video, 
              poster : val.poster, 
              backdrop : val.backdrop,       
             }).promise().done(function(){ 
              //the stuff you need 
             }); 
             m.save(function(err, movie_saved){ 
              if(err){ 
               console.log(err); 
              }else{ 
               console.log("saved"); 
              } 
             }); 
           }) 
          }      
         }).catch(function(err){ 
          if(err){ 
           console.log(err); 
          } 
         }); 
       }); 
     }); 
} 
+1

這不會在所有的工作。 –

+0

對不起,完成後需要保留每個 – Vixed

+0

當所有保存完成後,我將如何運行一段代碼? –