繁体   English   中英

一个诺言解决两种不同的类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM