![](/img/trans.png)
[英]Why does returning Promise.resolve() inside `then` cause two promise creation instead of one?
[英]one promise resolve with two different types
我最终在代码中有了这样的承诺。 如果我在某种情况下使用令牌值(字符串(resolve(token))
进行解析,而在另一种情况下使用Promise<string>
类型的另一个promise进行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返回字符串类型的Promise? 非常感谢你的帮助
正如注释中所指出的那样,您正在使用Promise构造函数反模式,为避免这种情况,您必须将代码直接链接到resultPromise
。
此外,您可以通过返回它来简化requestToken
调用的管理:
通常,.then处理程序返回的值会立即传递到下一个处理程序。 但是有一个例外。
如果返回值是一个promise,则进一步执行将被挂起,直到确定为止。 之后,该承诺的结果将提供给下一个.then处理程序。
(摘自本文 )
因此,您将得到如下所示的结果:
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
类型,而应使用并集类型 :
myAwesomeFunctionReturnStringOrNumber(): string | number {
...
};
myOtherFunctionTakeStringOrNumber(param: string | number) {
...
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.