我最终在我的代码中得到了这样的承诺。如果我在某些条件下解决了令牌的值(resolve(token))
并且在另一个条件下使用另一个类型为Promise<string>
的承诺来解决它是否正常:resolve(resultPromise);
const finalPromise = new Promise<string>(resolve => {
resultPromise.then(token => {
if (Pending) {
resolve(token);
} else if (!this.tokenIsValid(token)) {
resultPromise = requestToken();
resolve(resultPromise);
} else {
resolve(token);
}
});
我也试过像这样更改它并得到这个打字稿错误:
//抛出错误错误noUnnecessaryCallbackWrapper:不需要 在另一个函数中包装'resolve'。直接使用它。
#second verison
const finalPromise = new Promise<string>(resolve => {
resultPromise.then(token => {
if (Pending) {
resolve(token);
} else if (!this.tokenIsValid(token)) {
requestToken().then(token => resolve(token));
} else {
resolve(token);
}
});
如果我返回resolve(resultPromise)
,finalPromise的类型是什么?我担心的是有另一个函数获取finalPromise
并且输入的类型是Promise<string>
而我担心我正在弄乱响应并且我不知道。
我应该如何重写这个,以便finalPromise返回string类型的Promise?
非常感谢您的帮助
答案 0 :(得分:0)
正如评论中指出的那样,你使用的是Promise构造函数反模式,为了避免这种情况,你必须直接将代码链接到resultPromise
。
此外,您可以通过返回来简化requestToken
来电的管理:
通常,.then处理程序返回的值会立即传递给下一个处理程序。但是有一个例外。
如果返回的值是一个promise,则进一步执行将暂停,直到它结束。之后,该承诺的结果将被赋予下一个.then处理程序。
(引自this article)
所以你最终会得到这样的东西:
const finalPromise: Promise<string> = resultPromise.then(token => {
if (Pending) {
return token;
} else if (!this.tokenIsValid(token)) {
return requestToken();
} else {
return token;
}
);
// Later
finalPromise.then(stringToken => console.log(stringToken));
if-else语句也可以简化,但因为我不知道Pending
的类型我没有这样做。
仅供参考:这不是你的情况,但如果你真的需要某一天有多种回报类型,请不要使用any
,而是使用union type代替:
myAwesomeFunctionReturnStringOrNumber(): string | number {
...
};
myOtherFunctionTakeStringOrNumber(param: string | number) {
...
};