最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

在循环中对promises感到困惑

运维笔记admin17浏览0评论

在循环中对promises感到困惑

在循环中对promises感到困惑

我正在编写一个动态代码,可以执行以下操作。

  1. 扫描特定列并获取值并将其添加到数组中
  2. 将数组转换为set并返回到数组以获取唯一值
  3. 循环此设置值作为参数并获取实际值。

基本上尝试在DynamoDb中创建一个组。

在这里,第一步和第二步我能够做到。但是进入第3步我有一个循环,在循环内部代码必须执行,我的代码如下所示。

var AWS = require("aws-sdk");
var creds = new AWS.Credentials('akid', 'secret', 'session');

AWS.config.update({
    "accessKeyId": "myAccessId",
    "secretAccessKey": "MySecretAccessKey",
    "region": "us-east-1"
});

var dynamodb = new AWS.DynamoDB.DocumentClient();

var params = {
    TableName: "MyTable",
    FilterExpression: "#target_state = :target_state",
    ExpressionAttributeNames: {
        "#target_state": "target_state"
    },
    ExpressionAttributeValues: {
        ":target_state": "5"
    }
};
var array = [];


dynamodb.scan(params).promise().then(function (data) {
    data.Items.forEach(function (itemData) {
        array.push(itemData.ruleNo)
    });
    console.log(array);
    return array;
}).then(() => {
    console.log("Entered 2nd block " + [...new Set(array)]);
    var array2 = [...new Set(array)];

    for (index = 0; index < array2.length; ++index) {
        console.log(array2[index]);
        var params1 = {
            TableName: "ChemicalData",
            FilterExpression: "#target_state = :target_state and #ruleNo=:ruleNo",
            ExpressionAttributeNames: {
                "#target_state": "target_state",
                "#ruleNo": "ruleNo"
            },
            ExpressionAttributeValues: {
                ":target_state": "5",
                ":ruleNo": array2[index]
            }
        };


return dynamodb.scan(params1).promise().then(function (data) {
            var uw = JSON.stringify((data.Items));
            return uw;
        });
    }
}).then((data) => {
    console.log(data);
}).catch(err => {
    console.log(err)
})

当我运行这个程序时,我得到的结果只有一个值,这是第一个数组值,我无法知道如何循环遍历所有数组变量然后执行console.log(data)。请让我知道我哪里出错了,我该如何解决这个问题。

谢谢

回答如下:

在里面使用return来打破循环。您应该从内部扫描收集承诺到数组并使用Promise.all一起解决

dynamodb.scan(params).promise().then(function (data) {
    data.Items.forEach(function (itemData) {
        array.push(itemData.ruleNo)
    });
    console.log(array);
    return array;
}).then(() => {
    console.log("Entered 2nd block " + [...new Set(array)]);
    var array2 = [...new Set(array)];
    var results = []; //results array
    for (index = 0; index < array2.length; ++index) {
        console.log(array2[index]);
        var params1 = {
            TableName: "ChemicalData",
            FilterExpression: "#target_state = :target_state and #ruleNo=:ruleNo",
            ExpressionAttributeNames: {
                "#target_state": "target_state",
                "#ruleNo": "ruleNo"
            },
            ExpressionAttributeValues: {
                ":target_state": "5",
                ":ruleNo": array2[index]
            }
        };

        // push results to be resolved later
        results.push(dynamodb.scan(params1).promise().then(function (data) {
            var uw = JSON.stringify((data.Items));
            return uw;
        }));
    }
    // return promise that resolves when all results resolve
    return Promise.all(results);
})

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论