【问题标题】:Nested for loop in nodejs seems to be running asynchronouslynodejs中的嵌套for循环似乎是异步运行的
【发布时间】: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


【解决方案1】:

这里有几个问题

  • 当您有可用的 promise 方法时,您正尝试在循环中执行回调样式代码。
  • 您还可以使用promise.all 并行执行操作
  • 由于回调风格,代码非常复杂
  • 您正在等待不需要的地方。例如在回调中

你可以试试这种方式

exports.create = async (event, context, callback) => {

  try {
    let topicTimestamp = "";
    let endpoint = "";
    const data = await sns.listTopics().promise();
    // eslint-disable-next-line guard-for-in
    for (const topic in data.Topics) { // first loop
    // var topicData = "";
    // retrieve each topic and append to topicList if it is lakeview topic
      const topicData = data.Topics[topic].TopicArn;
      topicTimestamp = topicData.slice(22, 34); // get only the topic createdAt

      const params = {
        "TopicArn": topicData // topicData
      };
      console.log(`SUBS per${ params.TopicArn}`);

      const subscriptionData = await sns.listSubscriptionsByTopic(params).promise();
      const endpointList = [];
      // eslint-disable-next-line guard-for-in
      for (const sub in subscriptionData.Subscriptions) { // nested loop
        endpoint = subscriptionData.Subscriptions[sub].Endpoint;
        console.log(`ENDPOINT:: ${ endpoint}`);
        endpointList.push(endpoint);
      }

      // put topic info into table
      const topicsParams = {
        "TableName": tableName,
        "Item": {
          "id": uuidv4(),
          "createdAt": timestamp,
          "topicCreatedAt": topicTimestamp,
          "topic": topicData,
          "phoneNumbers": endpointList
        }
      };

      // Similarly use dynamodb .promise functions here
    }
  } catch (Err) {
    console.log(Err);
  }
};

aws-sdk 默认支持回调样式。要将它们转换为 Promise,您需要在末尾添加 .promise()

目前此示例使用 for 循环,但您也可以使用 Promise.all 执行相同的操作。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 2019-03-15
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多