如何在NodeJS中改进嵌套的promise调用?

时间:2017-07-01 18:22:38

标签: node.js promise

我是NodeJS的新手。

我想调用kms.decrypt三次(嵌套),以便在调用processEvents函数之前,变量填充它们的值。

你能否建议如何正确编写承诺=如何平行调用它们以便在控制进入processEvents之前填充所有值?

 exports.handler = function (event, context, callback) {


kms.decrypt({ CiphertextBlob: new Buffer(pwd_e, 'base64') }).promise().then(function(data) {
    pwd_d = data.Plaintext.toString('ascii');
    kms.decrypt({ CiphertextBlob: new Buffer(acl_e, 'base64') }).promise().then(function(data) {
        acl_d = data.Plaintext.toString('ascii');
        kms.decrypt({ CiphertextBlob: new Buffer(usr_e, 'base64') }).promise().then(function(data) {
            usr_d = data.Plaintext.toString('ascii');
            processEvent(event, context, callback);
        });
    });
}).catch(function(err) {
    console.log(err);
    context.done(err);
});
console.log(acl_d, usr_d, pwd_d);

};

1 个答案:

答案 0 :(得分:0)

您正在寻找Promise.all。如果您使用Promise.all,那么您的代码将会是什么样子:

Promise.all([
    kms.decrypt({ CiphertextBlob: new Buffer(pwd_e, 'base64') }).promise(),
    kms.decrypt({ CiphertextBlob: new Buffer(acl_e, 'base64') }).promise(),
    kms.decrypt({ CiphertextBlob: new Buffer(usr_e, 'base64') }).promise()
]).then(results => {
    const plainTexts = results.map(result => result.Plaintext.toString('ascii'));
    // plainTexts[0] === pwd_d in your code
    // plainTexts[1] === acl_d in your code
    // plainTexts[2] === usr_d in your code
    const [pwd_d, acl_d, usr_d] = plainTexts;
    processEvent(event, context, callback);
}).catch(err => {
    console.log(err);
    context.done(err);
});