Javascript es6承诺的奇怪打字错误
代码 promise的键入定义见Javascript es6承诺的奇怪打字错误,javascript,typescript,es6-promise,typescript-typings,Javascript,Typescript,Es6 Promise,Typescript Typings,代码 promise的键入定义见node_modules/typescript/lib/lib.es2015.iterable.d.ts 但是,如果我不返回被拒绝的承诺: { "compilerOptions": { "target": "es5", "module": "commonjs", "lib": [ "es6", "dom" ] } } getToken
node_modules/typescript/lib/lib.es2015.iterable.d.ts
但是,如果我不返回被拒绝的承诺:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"lib": [
"es6",
"dom"
]
}
}
getToken(authCode:string):承诺{
返回fetch(tokenUrl,{method:“POST”})。然后(res=>res.json())。然后(json=>{
返回新令牌(json);
});
}
不会有错误。那么,我如何才能返回被拒绝的承诺呢?如果您不返回被拒绝的承诺,您只需抛出一个会导致承诺被拒绝的错误:
getToken(authCode: string): Promise<Token> {
return fetch(tokenUrl, { method: "POST" }).then(res => res.json()).then(json => {
return new Token(json);
});
}
getToken(authCode:string):承诺{
返回fetch(tokenUrl,{method:“POST”})。然后(res=>res.json())。然后(json=>{
如果(json[“错误”]){
抛出新错误(json[“Error”]);
}
返回新令牌(json);
});
}
很抱歉回答了一个老问题,但我认为您需要将返回新令牌(json)
包装为Promise.resolve()
getToken(authCode:string):承诺{
返回fetch(tokenUrl,{method:“POST”})
.then(res=>res.json())
。然后(json=>{
如果(json[“错误”]){
返回承诺.拒绝(json);
}
//看到这个了吗
返回Promise.resolve(新令牌(json));
});
}
实际上,我使用抛出json[“json”]
,因为json[“error”]
是一个对象而不是字符串。但是我不明白当我返回被拒绝的承诺时会出现什么问题。然后传递给的函数应该返回一个值而不是承诺。如果一切顺利,它将返回值,否则将抛出错误。then
函数返回Promise
@Kevin:问题是,您的代码在错误情况下返回Promise
,在正常情况下返回Token
对象,因此json=>…
回调的推断返回类型是Token | Promise
,这会阻止类型推断对then()
方法执行任何合理的操作。您必须保持一致-您可以在正常情况下返回Promise.resolve(新令牌(json))
,在错误情况下返回Promise.reject(…)
,或者返回一个对象并抛出异常,如答案中的代码所示。
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"lib": [
"es6",
"dom"
]
}
}
getToken(authCode: string): Promise<Token> {
return fetch(tokenUrl, { method: "POST" }).then(res => res.json()).then(json => {
return new Token(json);
});
}
getToken(authCode: string): Promise<Token> {
return fetch(tokenUrl, { method: "POST" }).then(res => res.json()).then(json => {
if (json["error"]) {
throw new Error(json["error"]);
}
return new Token(json);
});
}
getToken(authCode: string): Promise<Token> {
return fetch(tokenUrl, { method: "POST" })
.then(res => res.json())
.then(json => {
if (json["error"]) {
return Promise.reject(json);
}
// See this
return Promise.resolve(new Token(json));
});
}