Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 每个异步调用_Javascript_Node.js_Promise_Bluebird - Fatal编程技术网

Javascript 每个异步调用

Javascript 每个异步调用,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,} 我想返回一个承诺或其他东西,以确保在所有的每次调用(即asyn searchMovie调用)结束后,我可以使用.then()从我存储在代码中的数据库中检索内容。 我是新的承诺,不知道如何做到这一点。 我有一个调用indexMovie函数的控制器,一旦调用结束,我想从数据库中检索保存的值。只需在每次调用结束时添加promise().done(function(){) var TheMovieDb = require('themoviedb'); var moviedbClient = new

}

我想返回一个承诺或其他东西,以确保在所有的每次调用(即asyn searchMovie调用)结束后,我可以使用.then()从我存储在代码中的数据库中检索内容。 我是新的承诺,不知道如何做到这一点。 我有一个调用indexMovie函数的控制器,一旦调用结束,我想从数据库中检索保存的值。

只需在每次调用结束时添加promise().done(function(){

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);
                            }
                        });
                });
        });
}

使用
Promise.each
而不是
。\each
等待异步操作。如果操作不相关,则使用
Promise.map
,以便它们可以同时执行

首先-正确的解决方案是让您的db调用成批执行查询,而不是对API进行100次查询,而是查询一次。
movieApi.searchMovies(val.name)
应该有一个
movieApi.searchMovies(…arrr)
选项,可以处理多个值,等等

也就是说,主要部分变成:

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);
                            }
                        });
                });
        });
}

当所有保存完成后,我如何运行一段代码?您可以使用Promise.all API,它已经是此类情况的标准。而不是您的解决方案。@Nirus:OP专门要求bluebird,这没有什么问题
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;
});