所以我遇到了以下问题:我有一个带有用于加密字符串的密钥的数组。 for循环遍历数组,使用当前密钥加密字符串,然后将加密的字符串压入新数组。代码如下:
var enc_gmessages = ['start'];
for(i = 0; i < pubkeys.length; i++) {
var pubkey = pubkeys[i];
if(pubkey != 'no' && pubkey != null) {
var publicKey = openpgp.key.readArmored(pubkey);
openpgp.encryptMessage(publicKey.keys, content).then(function(pgp_gmessage) {
//string encrypted successfully
console.log(pgp_gmessage);
enc_gmessages.push(pgp_gmessage);
}).catch(function(error) {
console.log('error');
});
}
}
alert(enc_gmessages);
如果字符串成功加密(并在控制台中登录),如果有一个有效的公钥,则该数组只包含&#39; start&#39; for循环后的元素。有人可以指出我做错了吗?
答案 0 :(得分:3)
您尝试在异步操作完成之前尝试获取值。
这是不可能的,所以你应该做的是创建一个新的Promise,其最终结果将是预期的消息数组:
function getMessages(pubkeys) {
// get an array of Promises for each valid key - each element is
// a promise that will be "resolved" with the encrypted message
var promises = pubkeys.filter(function(pubkey) {
return pubkey != null && pubkey != 'no';
}).map(function(pubkey) {
var publicKey = openpgp.key.readArmored(pubkey);
return openpgp.encryptMessage(publicKey.keys, content);
});
// then once all are resolved, return a new promise that
// is resolved with the desired array
return Promise.all(promises).then(function(messages) {
return ['start'].concat(messages);
});
}
虽然你可以在.catch
行之后Promise.all
,但在调用此点时捕获任何失败更为常见。
如果&#34;开始&#34;返回数组中的元素仅用于调试,实际上并不需要,只需用return Promise.all(promises)
替换整个返回块。
答案 1 :(得分:0)
我认为承诺制度在这里造成了麻烦。
您在openpgp.encryptMessage(...)
返回的每个promise的回调中将元素推送到数组中,因此循环在实际执行任何操作之前结束。