我正在和Node.js一起处理对noSQL DynamoDB的异步调用。我首先查询该帐户属于哪个“好友列表”。其可以从零返回到将包含每个伙伴列表的所有成员的列表的新的主键。把它们想象成一个人所属的俱乐部……你可以没有,也可以有很多;每个俱乐部都有几个成员,甚至一个。
到目前为止(我在这里第一次使用Promise...虽然我在以前的JA项目中使用过回调),但我对我所处的位置很满意,但我知道我正在错误地组装promises数组。也就是说,我可以在控制台中看到.then函数在两个承诺解析之前执行。郑重声明,我真的希望...这似乎是合理的,任何.then可能满足于一个单一的承诺解决。
无论如何,有没有人能提供一些关于如何构建结构的提示?我想以pseudo结束:
getBuddyLists .then(getAllTheBuddiesInTheLists) .then(.then(){//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)的位置;
发布于 2017-01-18 07:37:13
只是为了说明您将如何使用Promise.all,即使您接受了答案,但您编辑了问题,但仍然没有正确使用它
另外,关于.map与.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);
});发布于 2017-01-18 06:51:01
您正在寻找Promise.all(myPromises),它返回由promise结果组成的数组的单个promise。
https://stackoverflow.com/questions/41708430
复制相似问题