gpt4 book ai didi

javascript - 如何从 for 循环返回解析 Promise Like 对象

转载 作者:行者123 更新时间:2023-12-03 01:00:40 24 4
gpt4 key购买 nike

我自己的函数中有一个类似于 Promise 的对象,它使用 Web 加密 API 解密给定的消息。问题是,在我的解密函数中,我想尝试几个不同的值作为输入,并在 for 循环中多次运行这个像对象一样的 Promise,最后函数应该返回这些 Promise 成功解析的对象。

public decryptMessage(latitude: [string, number], longitude: [string, number], ciphertext: string) {
//get salt
const salt = localStorage.getItem("salt")
const retrievedSaltArray = JSON.parse(salt)
const saltBytes = new Uint8Array(retrievedSaltArray)

//get iv
const iv = localStorage.getItem("iv")
const retrievedIvArray = JSON.parse(iv)
const ivBytes = new Uint8Array(retrievedIvArray)

//get tolerance distance
let toleranceDistance = parseInt(JSON.parse(localStorage.getItem("toleranceDistance")))

//get original keyHash
let originalHash = localStorage.getItem("keyhash")

//create location inputs(locations with adjacent quadrants)
let location = new Location(latitude, longitude)
let locationInputs = location.prepareReceiverLocationInputs()

let encryptionTool = new EncryptionHelper(saltBytes, ivBytes)

for (let i = 0; i <= locationInputs.length - 1; i++) {
let plaintText = encryptionTool.decrypt(locationInputs[i], ciphertext, originalHash)
plaintText.then(function (plaintTextResult) {
return plaintTextResult
})
}

}

所以这里我尝试做的是,这个 Promise 像 ojbect 一样,即 cryptoTool.decryp() 应该在 for 循环中运行,然后这些 Promise 中的任何一个解析都应该是解密消息方法的返回值。但是,此 cryptoTool.decrypt 方法使用 webcrypto api,因此它没有拒绝或捕获方法,因为它是类似 Promise 的方法。

最佳答案

由于 Promise 代表了将来可用的值,因此您无法“现在”(同步)测试哪一个成功。相反,您必须使用可用的函数来操作和组合 Promise。我假设encryptionTool.decrypt返回 PromiseLike<string> ;如果是PromiseLike<T>对于其他一些T ,只需替换 string与此T如下。

首先,您可以使用Promise.resolve转换PromiseLike<string>Promise<string> 。然后,您想使用 Promise.all接受一组 promise 并返回结果数组的 promise ,因此您可以编写 then回调来扫描数组并获取您想要的结果。一个潜在的问题是Promise.all如果提供的任何 promise 被拒绝,则拒绝,在这种情况下您将看不到其他结果。所以在你使用 Promise.all 之前,您需要使用catch将拒绝映射到标记值,例如 null 。完整的代码看起来像这样(我没有测试过,所以可能会有错误):

    // Assuming that encryptionTool.decrypt returns a PromiseLike<string>,
// promises will be a Promise<string | null>[].
let promises = [];
for (let i = 0; i <= locationInputs.length - 1; i++) {
promises.push(
Promise.resolve(encryptionTool.decrypt(locationInputs[i], ciphertext, originalHash))
.catch((error) => null));
}
return Promise.all(promises).then((results) => {
// results is a (string | null)[].
// Look through it, find the non-null result and return it.
});

注意最后的then call 生成最终结果的 Promise,并且您将此 Promise 同步返回给 decryptMessage 的调用者.

另一种方法是制作 decryptMessage异步函数,以便您可以以更熟悉的风格进行编程。替换public decryptMessagepublic async decryptMessage然后使用这样的代码:

    for (let i = 0; i <= locationInputs.length - 1; i++) {
try {
return await encryptionTool.decrypt(locationInputs[i], ciphertext, originalHash);
} catch (e) {
// Discard the exception and proceed to the next decryption attempt.
}
}
// TODO: Decide what to return here if all decryptions fail.

请注意,这样,每次解密直到前一个解密失败后才会开始,因此该过程可能需要更长的时间才能完成,具体取决于 Web 加密 API 的实现方式。

关于javascript - 如何从 for 循环返回解析 Promise Like 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52636740/

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