Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript es6承诺的奇怪打字错误_Javascript_Typescript_Es6 Promise_Typescript Typings - Fatal编程技术网

Javascript es6承诺的奇怪打字错误

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

代码

promise的键入定义见
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));
    });
}