簡體   English   中英

AWS Lambda / Node.js函數調用序列

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

以下一段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;
}

函數調用的預期順序為:

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

實際結果如下:

  1. initInputAndDbParams
  2. placeOrderDelivery
  3. queryOrders。

除了返回值的initInputAndDbParams之外,我在所有函數中都使用了Promise。 遞歸調用findSuitableOrder以遍歷訂單數組。

如何獲得所需的函數調用順序?

我知道了:

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

一切正常都是有效的。

感謝您的所有帖子和幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM