2017-07-01 51 views
1

我是NodeJS的新手。如何改進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); 

};

回答

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); 
});