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

时间:2018-05-17 02:36:55

标签: javascript typescript promise resolve

我最终在我的代码中得到了这样的承诺。如果我在某些条件下解决了令牌的值(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? 非常感谢您的帮助

1 个答案:

答案 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) {
   ...
};