【问题标题】:Is promise wrapper necessary around lambda.invoke?lambda.invoke 是否需要 promise 包装器?
【发布时间】:2019-01-25 03:01:49
【问题描述】:

我有以下Promise.all 示例。

lambda.invoke 是否需要 promise 包装器?

引用了这个thread

function get1(id) {
    return new Promise((resolve, reject) => {
        const params = {
            FunctionName: 'myLambda', // the lambda function we are going to invoke
            InvocationType: 'RequestResponse',
            Payload: { id },
        };

        lambda.invoke(params, (err, data) => {
            if (err) {
                reject(new Error('error'));
            } else {
                const result = JSON.parse(data.Payload);
                resolve(result);
            }
        });
    }).catch(e => Promise.resolve({ error: 'Error has occurred.' }));
}

exports.getDetails = list => Promise.all(list.map(get1))
    .then((response) => {
        return result;
    }).catch((error) => {
        console.log('oops ', error);
    });

【问题讨论】:

    标签: javascript node.js amazon-web-services promise aws-lambda


    【解决方案1】:

    lambda.invoke() 有一个回调签名,这通常意味着你需要将它包装在一个 Promise 中,但如果你仔细观察你会发现它返回一个 AWS.Request 对象,其中包含一个 promise() 方法。它还记录了

    如果未提供回调,则必须在返回的请求对象上调用AWS.Request.send() 来发起请求。

    对于AWS.Request.promise()

    发送请求并返回一个“thenable”承诺。

    所以你得到的get1(id) 看起来像:

    function get1(id) {
        const params = {
            FunctionName: 'myLambda', // the lambda function we are going to invoke
            InvocationType: 'RequestResponse',
            Payload: { id },
        };
    
        return lambda.invoke(params).promise().then(({ Payload }) => JSON.parse(Payload));
    }
    

    【讨论】:

    • 我的错误处理在哪里适合这个?
    • @Rod 如果请求失败,API 会拒绝承诺,因此调用代码中的 .catch() 就足够了。您不应该用 new Error('error') 掩盖真正的错误,这是一种不好的做法,因为它会阻止您看到问题的原因,所以我在回答中省略了这样做。
    • 如何添加被拒绝的部分?因为我的渔获没有被抓住。我可以将错误更改为更明显
    • 除非出现错误,否则不会调用 .catch()。它没有被调用的事实意味着代码正在运行。
    • 如何/在哪里可以在返回之前根据 Payload 添加条件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 2021-10-08
    • 1970-01-01
    • 2017-05-11
    • 2014-11-17
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多