通过函数React Native传递promises

时间:2018-04-21 07:52:02

标签: javascript reactjs react-native ecmascript-6 fetch

我是全新的反应本地人,我一直在浏览代码片段,并对如何传递承诺感到困惑。

我有一个事件处理程序onRefresh(),当我在平面列表中下拉时我会尝试让它在返回true / false时使用apiSearchDB的返回值。

onRefresh = () => {
  this.setState({...}, () => {
    return this.apiSearchDB()
      .then(function(response) {
        console.log(response);
      })
      .catch((error) => {
        console.log(error);
      });
  })
}

apiSearchDB = () => {
    return fetch('/some_endpoint')
     .then((response) => response.json())
     .then((json) => {
       this.setState({
          ...
       }, () => {return true})
       return true;
    }).catch((error) => {
       console.error(error);
       return false;
    })
 }

console.log(response);行仅打印undefined,我无法弄清楚原因。

我的处理程序也可以写成

onSearch = () => {
   return new Promise((resolve, reject) => {
      var response = this.apiSearchDB();
       response
          ? resolve();
          : reject();
        }
   });
 }

onSearch = () => {...}function onSearch(){...}

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您应该阅读有关使用promises的更多信息(好文章 - We have a problem with promises)。但是,在这种情况下,有两个基本规则可以帮助您:

  • 承诺返回的值包含在承诺中。
  • 承诺可以链接。

apiSearchDB应返回包含json作为已解析值的承诺,并error作为被拒绝的值:

apiSearchDB = () =>
  fetch('/some_endpoint')
    .then((response) => response.json())
    .then((json) => json)
    // can be removed unless you want to do something with the error before passing it on
    .catch((error) => Promise.reject(error));

onRefresh(或onSearch)方法应该从apiSearchDB获得承诺,并添加它自己的链。应使用then处理程序处理Resolve promise。如果它是被拒绝的值,它将由catch处理程序处理:

onRefresh = () =>
  this.apiSearchDB()
    .then((response) => {
      console.log(response);

      // do something with response          
      this.setState({...}, () => {

      });

      return response;
    })
    .catch((error) => {
      console.log(error);

      // do something with error          
      this.setState({...}, () => {

      });
    });
}