Javascript 如何确定链中最后一个承诺的返回类型?
我想作为函数的结果返回链中的最后一个承诺。我使用的是TypeScript 1.7和本机ES6 我试过了,但是TS认为第一个承诺是返回值(Uint8Array),而不是importKey的加密密钥。我看过JavaScript示例,这些示例让我认为最后一个承诺实际上是返回值,所以TS可能只是感到困惑Javascript 如何确定链中最后一个承诺的返回类型?,javascript,typescript,promise,es6-promise,Javascript,Typescript,Promise,Es6 Promise,我想作为函数的结果返回链中的最后一个承诺。我使用的是TypeScript 1.7和本机ES6 我试过了,但是TS认为第一个承诺是返回值(Uint8Array),而不是importKey的加密密钥。我看过JavaScript示例,这些示例让我认为最后一个承诺实际上是返回值,所以TS可能只是感到困惑 private getKey(): Promise<Uint8Array> { return localforage.getItem<Uint8Array>("key")
private getKey(): Promise<Uint8Array> {
return localforage.getItem<Uint8Array>("key")
.then<Uint8Array>((derivedKeyData) => {
return crypto.subtle.importKey("raw", derivedKeyData, { name: "AES-GCM" }, false, ["decrypt"]);
});
}
private getKey():承诺{
返回localfollow.getItem(“键”)
.然后((derivedKeyData)=>{
返回crypto.division.importKey(“raw”,derivedKeyData,{name:“AES-GCM”},false,[“decrypt”]);
});
}
如何作为函数的结果返回内部承诺?或者至少让TS相信,在不使函数的返回类型为“any”的情况下,这才是真正发生的事情?我在上查看了您的代码,问题似乎是importKey的内置结果类型为“any”
我不知道TS,所以我只想评论一下:您立即返回
localfough.getItem
,这就是您的类型签名必须匹配的原因。为了解决这个问题,您必须使用returnnewpromise(resolve,reject)=>…
包装整个方法体,并让importKey
调用resolve()
。。类似于importKey(…).then(resolve).catch(reject)
@Matt我开始沿着这条路线走,这似乎是可行的,但后来我意识到我在下面的答案中提到的键入错误。这个答案让我找到了正确的答案-then
的类型代表了下一个承诺的输出类型,也是函数的返回类型。所以函数实际上是在返回链中的最后一个承诺,我只是把我的类型弄错了。例如,return localfour.getItem(“x”)。然后((forageItem)=>{return crypto.importKey(…);})
在我的例子中,这是有效的,因为即使在TS定义中,importKey返回我使用的any
,它也是加密密钥。