2017-12-19 4 views
0

Ich schreibe einen Dynamodb-Code, der das folgende tut.Verwirrt mit Versprechen in einer Schleife

  1. Scannen Sie eine bestimmte Spalte und die Werte erhalten, und fügen Sie sie in ein Array
  2. das Array konvertieren Array zu setzen und wieder die einzigartigen Werte zu erhalten
  3. Schleife durch diese eingestellten Werte als Parameter und erhalten der tatsächliche Wert.

Grundsätzlich versuchen, eine Gruppe von in DynamoDb zu erstellen.

Hier der 1. und 2. Schritt kann ich es tun. aber zu Schritt 3 komme ich habe eine Schleife und innerhalb der Schleife muss der Code ausgeführt werden und mein Code ist wie folgt.

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

, wenn ich dieses Programm ausführen, dass ich das Ergebnis erhalten, ist nur ein Wert, und das ist das erste Array-Wert, ich bin nicht in der Lage zu wissen, wie kann ich eine Schleife durch die alle Array-Variablen und dann tun a console.log(data). Bitte lassen Sie mich wissen, wo ich falsch liege und wie ich das beheben kann.

Dank

Antwort

1

Mit return innerhalb der Schleife für die Pausen. Sie sollten Versprechungen vom inneren Scan in Array sammeln und Promise.all verwenden, um dann zusammen

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); 
}) 
zu lösen
Verwandte Themen