将获取的结果发送到程序的另一部分

Sending results from fetch to another part of program

我正在用 React Native 创建一个应用程序,在从我的服务器获取数据并在我的程序中使用它时遇到了一些主要问题。

我的架构与 React Native 在其文档中提供的示例略有不同,但我尝试了多种不同的方法。令牌是正确的,我显然在某种意义上正确地调用了该方法,但它不会 return 数据到我程序的另一端。

在Methods.js

exports.loginUser = function(TOKEN) {
      fetch(baseUrl + 'login' , {
      method: 'POST',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        accessToken: TOKEN,
      },)
    })
    .then((response) => response.text())
    .then((responseText) => {

        console.log(typeof responseText);
        return responseText
    })
    .catch((error) => {
      console.warn(error);
    });
  };

它将数据类型记录为字符串,当我按原样调用它时它会正确打印出来。但是,我的应用无法以任何方式检索数据,它只是 return 未定义。

在Home.js

var Method = require('../Services/Methods');
.
.
.
var ComponentTwo = React.createClass({

  getInitialState: function() {
    return {
      text: 'Loading...',      
    }
  },
  componentDidMount: function() {
    {
      this.setState({
        text: Method.loginUser(AccessToken)
      })
    }
  },

  render: function() {

    console.log(Method.loginUser(AccessToken));
    console.log(this.state.text);

我现在处于试错模式,但是两个日志 return 都未定义,除了我的登录 Methods.js,所以我认为只是点击 return responseText,但我不知道任何其他方式,因为它们在两个单独的文件中。所以我认为问题出在 Method.JS 内,因为在我尝试过的所有方法中调用它都失败了。

我认为您必须 return 来自 loginUser 函数的承诺,例如:

exports.loginUser = function(TOKEN) {
  return new Promise((resolve, reject) => {
      fetch(baseUrl + 'login' , {
      method: 'POST',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        accessToken: TOKEN,
      },)
    })
    .then((response) => response.text())
    .then((responseText) => {
        console.log(typeof responseText);
        resolve(responseText);
    })
    .catch((error) => {
        reject(error);
    });
  });
};

然后像这样调用你的函数:

Method.loginUser(AccessToken)
.then((res) => console.log(res))
.catch((error) => console.log(error))
.done();

我还没有验证上面的代码是否有效,只是给你一个想法。