代码之家  ›  专栏  ›  技术社区  ›  user1692342

如何链接nodejs中多个文件返回的承诺

  •  0
  • user1692342  · 技术社区  · 7 年前

    我正在尝试编写一个Lambda代码,在这里我尝试向DynamoDB中创建多个条目,如果失败,我会向SQS中输入一条错误消息。我想用承诺来实现这一点。

    var AWS = require('aws-sdk');
    
    exports.operation = function(ddbEvent) {
        var dynamoDB = new AWS.DynamoDB();
        var params = {};
    
        var operation = ddbEvent.operation;
        switch(operation) {
            case 'insert':
            case 'modify':
                params["Item"] = ddbEvent.entry;
                //Fill in params object from ddbEvent;
    
                return dynamoDb.putItem(params, function(err, data) {
                    //Nothing to do just log
                    if(err) {
                        //log error msg
                    } else {
                        //log success
                    }
                }).promise();
    
            case 'delete':
                //Do nothing operation
                return Promise.resolve();
    
            default:
                console.warn("unsupported");
        }
    };
    

    我的SQS.js文件:

    var AWS = require('aws-sdk');
    
    exports.sqsOperation = function(message) {
        var sqs = new AWS.SQS({
    
        });
    
        var params = {
            //Use message to form the body
        };
    
        return sqs.sendMessage(params, function(err, data) {
            //Nothing to do just log like in DDB.js
        }).promise();
    };
    

    我的main.js文件(Lambda调用):

    var AWS = require('aws-sdk');
    var SQS = require('SQS');
    var DDB = require('DDB');
    
    
        exports.replicate = function(event, context, callback) {
            var ddbPromise = [];
            var sqsPromise = [];
    
            event.Records.forEach((entry) => {
                let p = DDB.operation(entry);
                ddbPromise.push(p);
                p.then(function(data) {
                    //write to ddb succssfull;
                }).catch(function (err) {
                    //ddb save failed, try writing to sqs.
                    let sqsP = SQS.sqsOperation(entry);
                    sqsPromise.push(sqsP);
                    sqsP.then(function (data) {
                        //push to sqs success
                    }).catch(function (err) {
                        //push to sqs failed
                    });
                });
            });
    
            var ddb_promises_all = Promise.all(ddbPromise);
    
            ddb_promises_all.then(function (data) {
                //all entries saved in DDB 
                callback(null, "success");
            }).catch(function (err) {
                //Now repeat wait for all sqs promises. If any sqs push failed then
                //use callback(new Error("error"));
            });
        }
    

    2 回复  |  直到 7 年前
        1
  •  1
  •   deerawan    7 年前

    exports.replicate = function(event, context) {
      // if possible, use Promise for consistency
      return new Promise((resolve, reject) => {
    
        // I feel that using `map` is cleaner than `forEach`
        const ddbOperationPromises =  event.Records.map(entry => ddbOperation(entry));
    
        return Promise.all(ddbOperationPromises)
          .then(data => {
            // success
            resolve();
          })
          .catch(err => {
            // catch error
          })
      });
    }
    
    function ddbOperation(entry) {
      return DDB.operation(entry)
        .then((data) => {
          // success
        })
        .catch((err) => {
          return sqsOperation(entry);
        })
    }
    
    function sqsOperation(entry) {
      return SQS.sqsOperation(entry)
        .then((data) => {
          // success
        })
        .catch((err) => {
          // handling err
        })
    }
    
        2
  •  1
  •   eavichay    7 年前

    异步等待救援 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

    async function doDBStuff (...)
    async function doOtherStuff (...)
    
    async function doSequentially () {
      await doDBStuff(...);
      await doOtherStuff(...);
    }
    
    async function doInParallel () {
      await Promise.all([doDBStuff(...), doOtherStuff(...)]);
    }
    
    推荐文章