【问题标题】:How to return values from nested promise?如何从嵌套的 Promise 中返回值?
【发布时间】:2013-10-26 14:47:05
【问题描述】:

我在 Redis 中有一组电影 ID:[1,2,3,4] 和一组包含实际数据的哈希值。现在,我想一次性获取 ID 的所有电影数据。

我正在尝试使用 bluebird Promises,但我被卡住了。到目前为止,我有:

函数 allMovies() { var 电影,movieIds; return client.smembersAsync('movies.ids').then(function(ids) { 电影ID = ID; 电影 = _.map(movieIds,函数(id){ 变种电影; return client.hmgetAsync("movies:" + id, 'title', 'description', 'director', 'year').done(function(data) { 电影=数据; 返回 { 标题:数据[0], 描述:数据[1], 导演:数据[2], 年份:数据[3] }; }); 返回电影; }); })

问题在于我的尝试,我总是得到一个新的承诺,而我只对所有操作完成后的 JSON 感兴趣。

这里的任何人都可以对此有所了解吗?

【问题讨论】:

    标签: node.js redis promise bluebird


    【解决方案1】:

    在蓝鸟中,有一种更甜的方法:

    function allMovies() {
        return client.smembersAsync("movies.ids").map(function(id){
            return client.hmgetAsync( "movies:" + id, 'title', 'description', 'director', 'year');
        }).map(function(data){
            return {
                title: data[0],
                description: data[1],
                director: data[2],
                year: data[3]
            };
        });
    }
    

    【讨论】:

    • { isFulfilled:true,isRejected:false,fulfillmentValue:[],rejectionReason:未定义}
    • @poseid 您如何使用allMovies() 功能?如果您像allMovies().then(function(movies){console.log(movies)}) 一样使用它,那么这是一个严重的错误。但是,看起来您确实像 console.log(allMovies()) 一样使用它 - 该函数不返回电影它返回电影的承诺。
    • 两者都会导致空数组:ma.then(function(m) { console.log(m) }) 和 ma.allMovies() 以及来自 allMovies 的承诺。我会在 Github 中提交一个错误。
    【解决方案2】:

    如果 Bluebird 在这个问题上与 Q 一致,那么只需将你的一系列承诺转化为一系列结果的承诺。请注意在您的示例中添加了Q.all,处理程序内部的返回,以及使用then 而不是done 来链接电影承诺。

    function allMovies() {
        var movies, movieIds;
        return client.smembersAsync('movies.ids').then(function(ids) {
            movieIds = ids;
            movies =  _.map(movieIds, function(id) {
               var movie;
               return client.hmgetAsync("movies:" + id, 'title', 'description', 'director', 'year')
               .then(function(data) {
                   return {
                       title: data[0], 
                       description: data[1], 
                       director: data[2],
                       year: data[3]
                    };
                });
            });
            return Q.all(movies);
        })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      • 2019-01-09
      • 2021-04-20
      • 2020-04-13
      • 1970-01-01
      • 2017-04-03
      • 2017-12-20
      相关资源
      最近更新 更多