javascript - Promise 与 _.each 异步调用

标签 javascript node.js promise bluebird

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 或其他东西,这将确保一旦我所有的每个调用(即进行的异步 searchMovie 调用)结束,然后我可以使用 .then() 从我的数据库中检索内容正在存储在代码中。 我对 promise 很陌生,不知道该怎么做。 我有一个调用 indexMovie 函数的 Controller ,一旦调用结束,我想从数据库中检索保存的值。

最佳答案

使用 Promise.each 而不是 _.each 来等待异步操作。如果操作不相关,请使用 Promise.map 代替,以便它们可以并发执行。

首先 - 正确的解决方案是让您的数据库调用批量执行查询,而不是为 100 个事物查询 API 100 次,只查询一次。 movieApi.searchMovies(val.name) 应该有一个适用于多个值的 movieApi.searchMovies(...arrr) 替代方案,依此类推。

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

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

关于javascript - Promise 与 _.each 异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34310760/

相关文章:

javascript - JavaScript 中有 URL 类吗?

javascript - Bootstrap4 对齐 self 基线不起作用

node.js - NodeJS 集群将所有请求发送给一个工作人员 (Windows)

带有参数的 javascript 抽象回调

javascript - 在 firebase 中,为什么事务不像在 admin api 中那样在云函数中工作?

javascript - 解析 XML 时出错,第 337 行,第 62 列 : The reference to entity "appId" must end with the ';' delimiter

javascript - 如何仅在浏览器环境中执行函数

node.js - 避免用户从控制台调用函数(express app)

javascript - promise 中的 promise

javascript - 如何在错误时打破 promise 链