【发布时间】:2020-05-31 18:18:13
【问题描述】:
所以我有两个 for 循环,一个嵌套在另一个循环中,但它们返回的结果似乎是运行第一个循环并返回其结果而不是嵌套循环。我怎样才能让它以同步行为运行? 例如,所有 topicData 都打印在一行中,而不是打印一个 topicData 并进入嵌套的 for 循环。 我不确定这是否是实现异步等待的正确方法。任何指针将不胜感激。谢谢
exports.create = (event, context, callback) => {
var topicTimestamp = "";
var endpoint = "";
sns.listTopics(async function(err, data) {
if (err) {
console.log(err, err.stack);
} else {
console.log(data);
for (var topic in data.Topics){ //first loop
//var topicData = "";
//retrieve each topic and append to topicList if it is lakeview topic
var topicData = await data.Topics[topic].TopicArn;
topicTimestamp = topicData.slice(22, 34); //get only the topic createdAt
var params = {
TopicArn: topicData //topicData
};
console.log("SUBS per" + params.TopicArn);
//retrieve subscriptions attached to each topic
sns.listSubscriptionsByTopic(params, async function(err, subscriptionData){
console.log(subscriptionData);
//console.log("SUBS per" + params.TopicArn);
if (err) {
console.log(err, err.stack); // an error occurred
} else {
var endpointList = [];
for (var sub in subscriptionData.Subscriptions) { //nested loop
endpoint = await subscriptionData.Subscriptions[sub].Endpoint;
console.log("ENDPOINT:: " + endpoint);
endpointList.push(endpoint);
}
} // end of else listSub
//put topic info into table
var topicsParams = {
TableName: tableName,
Item: {
id: uuidv4(),
createdAt: timestamp,
topicCreatedAt: topicTimestamp,
topic: topicData,
phoneNumbers: endpointList
},
};
endpointList = []; //reset to empty array
dynamoDb.put(topicsParams, (error) => {...}
【问题讨论】:
-
对所有异步操作使用一个promise接口(或者如果一个promise接口不存在,则创建一个promise包装器)并使用
await这些promise。这将允许您使用异步操作对for循环进行排序。它还将使错误处理更加清晰(您根本没有真正做好。
标签: javascript node.js amazon-web-services aws-lambda amazon-sns