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

时间:2018-08-18 06:49:06

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

我有以下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);
    });

1 个答案:

答案 0 :(得分:4)

lambda.invoke()具有回调签名,这通常意味着您需要将其包装在Promise中,但是如果仔细看,您会注意到它返回了一个AWS.Request对象,其中包含一个{{ 3}}方法。它还记录了

  

如果未提供回调,则必须在返回的请求对象上调用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));
}