简体   繁体   English

AWS Lambda / Node.js函数调用序列

[英]AWS Lambda/Node.js function call sequence

The following piece of AWS lambda code (highly simplified): 以下一段AWS Lambda代码(高度简化):

'use strict';
var aws = require('aws-sdk');

var docClient = new aws.DynamoDB.DocumentClient();

exports.handler = (event, context, callback) => {
    var inputorder = initInputAndDbParams(event);

    queryOrders(inputorder)
        .then(findSuitableOrder.bind(null, inputorder)) //findOrder requires query result
        .then(placeNewOrder(inputorder));

    callback(null, "ORDER OK");
}

function queryOrders(inputorder) {
    return new Promise(function(resolve, reject) {
        docClient.query(inputorder.dbparams.qparams, function(err, data) {
            if (err) {
                reject(err);
            } else {
                resolve(data); // gets back the query result array
            }
        }
    }

    // Recursive!!
function findSuitableOrder(inputorder) {
    return new Promise(function(resolve, reject) {
        if (array.length === 0 || orderamount === 0) resolve();

        order = array.shift();

        if (order.article = inputorder.article) {
            deleteOrder(inputorder)
                .then(placeNewOrder);
        }
    }
}

function deleteOrder(inputorder) {
    return new Promise(function(resolve, reject) {
        docClient.delete(inputorder.dbparams.delparams, function(err, data) {
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        }
    }

function placeNewOrder(inputorder) {
    return new Promise(function(resolve, reject) {
        docClient.put(inputorder.dbparams.wparams, function(err, data) {
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        }
    }

function placeOrderDelivery(inputorder) {
    return new Promise(function(resolve, reject) {
        docClient.put(inputorder.dbparams.odparams, function(err, data) {
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        });
    }
}

function initInputAndDbParams(event) {
    var inputorder = {
        article: "example",
        price: 54
        amount: 1
    };

    return inputorder;
}

The expected Order of the function calls is: 函数调用的预期顺序为:

  1. initInputAndDbParams initInputAndDbParams
  2. queryOrders queryOrders
  3. findSuitableOrder a) deleteOrder b) placeNewOrder findSuitableOrder a)deleteOrder b)placeNewOrder
  4. placeOrderDelivery placeOrderDelivery

Actual result like: 实际结果如下:

  1. initInputAndDbParams initInputAndDbParams
  2. placeOrderDelivery placeOrderDelivery
  3. queryOrders . queryOrders。 .

I am using promises in all functions, except in initInputAndDbParams which returns a value. 除了返回值的initInputAndDbParams之外,我在所有函数中都使用了Promise。 findSuitableOrder is called recursively to iterate through the array of orders. 递归调用findSuitableOrder以遍历订单数组。

How can I get the required sequence of function calls? 如何获得所需的函数调用顺序?

I got it: 我知道了:

queryOrders(inputorder).then(function (orders) {
    return findSuitableOrder(inputorder, orders);
}).then(function() {
    return placeNewOrder(inputorder);
}).catch(function (err) {
    console.log(err);

That works an everything is in sequence. 一切正常都是有效的。

Thanks for all your posts and help! 感谢您的所有帖子和帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM