首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript Promises -创建要一起执行的promises数组

JavaScript Promises -创建要一起执行的promises数组
EN

Stack Overflow用户
提问于 2017-01-18 06:49:48
回答 2查看 13K关注 0票数 7

我正在和Node.js一起处理对noSQL DynamoDB的异步调用。我首先查询该帐户属于哪个“好友列表”。其可以从零返回到将包含每个伙伴列表的所有成员的列表的新的主键。把它们想象成一个人所属的俱乐部……你可以没有,也可以有很多;每个俱乐部都有几个成员,甚至一个。

到目前为止(我在这里第一次使用Promise...虽然我在以前的JA项目中使用过回调),但我对我所处的位置很满意,但我知道我正在错误地组装promises数组。也就是说,我可以在控制台中看到.then函数在两个承诺解析之前执行。郑重声明,我真的希望...这似乎是合理的,任何.then可能满足于一个单一的承诺解决。

无论如何,有没有人能提供一些关于如何构建结构的提示?我想以pseudo结束:

getBuddyLists .then(getAllTheBuddiesInTheLists) .then(.then(){//doSomething});

我的Node.js代码:

代码语言:javascript
复制
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region:'us-east-1'});
var buddyGroups = [];

exports.handler = function(event, context, callback) {
    var params = {
        TableName: 'USER_INFORMATION',
        Key: {
            "DEVICE_ID": event.DEVICE_ID
        }
    };

    var getBuddyList = new Promise(function(resolve, reject){
        docClient.get(params, function(err, data){
            if(err){
                reject(err);
            }
            else{
                var dataJSON = JSON.parse(JSON.stringify(data));
                dataJSON.Item.my_buddies.values.forEach(function(value){
                    buddyGroups.push(value);
                });
                console.log('Got buddy groups: ' + buddyGroups);
                resolve(buddyGroups);
            }
        });
    });

    getBuddyList.then(function(capturedData){  // capturedData => an array of primary keys in another noSQL document
        console.log('groups: ' + capturedData);
        var myPromises = [];
        capturedData.forEach(function(value){
            var reqParams = {
                        TableName: "buddy_list",
                        Key: {"BUDDY_ID": value}
                    };
            myPromises.push(new Promise (function(resolve, reject){
                docClient.get(reqParams, function(err, data){
                    if(err){
                        //console.log(err, data);
                    reject(err);
                    }else{
                        var returnedJSON = JSON.parse(JSON.stringify(data));
                        console.log(returnedJSON);
                        resolve(returnedJSON);
                    }
                });
            }));
        });
        //
        Promise.all(myPromises); // ADDED IN EDIT <<<<<<<<<<<<<<<<<<<<<<
        // how to make sure all of myPromises are resolved?
        //
    }).then(function(){
            console.log("done");
        })
    .catch(function(err){
        console.log("error message:" + error);
    });
};

编辑:增加Promise.all(MyPromises)的位置;

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-18 07:37:13

只是为了说明您将如何使用Promise.all,即使您接受了答案,但您编辑了问题,但仍然没有正确使用它

另外,关于.map与.forEach的讨论--这就是您如何使用.map

代码语言:javascript
复制
    getBuddyList.then(function(capturedData){  // capturedData => an array of primary keys in another noSQL document
        console.log('groups: ' + capturedData);
        // changes to use .map rather than .forEach
        // also, you need to RETURN a promise - your edited code did not
        return Promise.all(capturedData.map(function(value){
            return new Promise (function(resolve, reject){
                var reqParams = {
                    TableName: "buddy_list",
                    Key: {"BUDDY_ID": value}
                };
                docClient.get(reqParams, function(err, data){
                    if(err){
                        //console.log(err, data);
                    reject(err);
                    }else{
                        var returnedJSON = JSON.parse(JSON.stringify(data));
                        console.log(returnedJSON);
                        resolve(returnedJSON);
                    }
                });
            });
        }));
    }).then(function(){
            console.log("done");
        })
    .catch(function(err){
        console.log("error message:" + error);
    });
票数 10
EN

Stack Overflow用户

发布于 2017-01-18 06:51:01

您正在寻找Promise.all(myPromises),它返回由promise结果组成的数组的单个promise。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41708430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档