在for循环中向数组添加元素,在循环之后添加空数组

时间:2016-01-07 16:16:16

标签: javascript loops for-loop

所以我遇到了以下问题:我有一个带有用于加密字符串的密钥的数组。 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循环后的元素。有人可以指出我做错了吗?

2 个答案:

答案 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的回调中将元素推送到数组中,因此循环在实际执行任何操作之前结束。