gpt4 book ai didi

javascript - 在for循环中向数组添加元素,循环后为空数组

转载 作者:行者123 更新时间:2023-11-29 19:17:24 27 4
gpt4 key购买 nike

所以我遇到了以下问题:我有一个数组,其中包含用于加密字符串的 key 。 for 循环遍历数组,使用当前 key 加密字符串,然后将加密的字符串插入新数组。这里的代码:

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

虽然字符串被成功加密(并记录在控制台中),但如果存在有效的公钥,则该数组仅包含 for 循环后的“开始”元素。有人可以指出我做错了什么吗?

最佳答案

您正试图在异步操作完成之前从它获取一个值。

那是不可能的,所以您应该做的是创建一个新的 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);
});
}

虽然您可以在 Promise.all 行之后 .catch,但更常见的做法是在调用此点时捕获任何失败。

如果返回数组中的“开始”元素只是用于调试,实际上并不是必需的,只需将整个返回 block 替换为 return Promise.all(promises)

关于javascript - 在for循环中向数组添加元素,循环后为空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34660030/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com