одно обещание решается с двумя разными типами - PullRequest
0 голосов
/ 17 мая 2018

В итоге в моем коде появилось такое обещание. Это нормально, если я разрешу в каком-то условии со значением токена, который является строкой (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);
        }
    });

Я также попытался изменить это так и получил эту ошибку машинописи:

// выдает ошибку error noUnneededCallbackWrapper: не нужно оберните «решите» в другую функцию. Просто используйте его напрямую.

#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);
        }
    });

Каким будет тип finalPromise в случае, если я возвращаю resolve(resultPromise)? меня беспокоит то, что есть другая функция, которая получает finalPromise, а тип ввода - Promise<string>, и меня беспокоит, что я путаю ответы, и я не в курсе. Как мне переписать это так, чтобы finalPromise возвращал Promise типа string? Большое спасибо за вашу помощь

1 Ответ

0 голосов
/ 17 мая 2018

Как отмечалось в комментариях, вы используете анти-шаблон конструктора Promise, чтобы избежать этого, вы должны напрямую связать свой код с resultPromise.

Более того, вы можете упростить управление вызовом requestTokenвозвращая его:

Обычно значение, возвращаемое обработчиком .then, немедленно передается следующему обработчику.Но есть исключение.

Если возвращаемое значение является обещанием, то дальнейшее выполнение приостанавливается до тех пор, пока оно не установится.После этого результат этого обещания передается следующему обработчику .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) {
   ...
};
...