在fetch中添加catch时出错

时间:2017-10-11 17:00:19

标签: javascript typescript ecmascript-6 fetch

在我的代码中,当我添加catch时,typescript会显示下一个错误:

  

[TS]    “承诺”类型不能分配给“承诺”类型。    输入'void | ItemEntity []'不能分配给'ItemEntity []'类型。       类型'void'不能分配给'ItemEntity []'。

同样只有一个thencath我没有错误。

当我同时使用两个thencatch时,会出现错误。

这是代码:

// HTTP GET
getAllItems(): Promise<ItemEntity[]> {
     const request = new Request('http://localhost:4000/api/items', {
         method: 'GET',
         mode: 'cors',
         redirect: 'follow',
         headers: new Headers({
            'Content-Type': 'text/plain'
         })
     })

     return fetch(request)
      .then( (response) => (response.json()) )
      .then( (items) => (this.resolveMembers(items)) )
      // FIXME
      //.catch( (error) => (console.log(error)) );  
}

private resolveMembers (data : any[]) : ItemEntity[] {
    const items : ItemEntity[] = data.map((item) => {
        let newItem : ItemEntity = new ItemEntity();
        newItem.id = item.id;
        newItem.task = item.task;
        return newItem;
    });
    return items;
}

我已经在节点服务器上检查了没有catch的功能,并且GET工作正常。

1 个答案:

答案 0 :(得分:3)

它告诉你,你说你的方法将返回Promise<ItemEntity[]>,但你试图返回Promise<void>

在承诺链中间的

catch意味着尝试恢复并继续在链上。你应该只捕获你可以恢复的东西,否则让错误传播起来让别人抓住它。

代码的简单恢复就是返回一个空数组。我猜想后来的调用将能够处理一个空数组。

return fetch(request)
  .then( (response) => (response.json()) )
  .then((items) => (this.resolveMembers(items))) 
  .catch((error) => {
        console.log(error)
        return []
   })

否则你就不能将你的捕获物作为链的一部分

var promise = fetch(request)
promise.catch(console.log)
return promise
  .then( (response) => (response.json()) )
  .then((items) => (this.resolveMembers(items)))