当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《JavaScriptPromises-创建要一起执行的promise数组》经验,为你挑选了1个好方法。

我正在使用Node.js对noSQL DynamoDB进行异步调用.我首先查询该帐户所属的"好友列表".这可能会从零返回到'n'个新主键,其中包含每个好友列表的所有成员的列表.把它们想象成一个人所属的俱乐部......你可能没有或很多; 每个俱乐部都有几个成员甚至一个成员.

到目前为止(我在这里第一次使用Promise ...虽然我在之前的JA项目中使用了回调)但我对我的位置没问题,但我知道我正在组装承诺数组不正确.也就是说,我可以在控制台中看到.then函数在两个promises解析之前执行.为了记录,我确实希望...任何.then可能满足于单一的承诺解决似乎是合理的.

无论如何,有人可以提供一些关于如何构建的提示吗?我想最终得到伪:

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

我的Node.js代码:

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)的位置;



1> 小智..:

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

此外,讨论.map vs .forEach - 这就是你使用.map的方法

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

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有