Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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 如何在react native中链接获取和承诺?_Javascript_Api_React Native_Promise_Fetch - Fatal编程技术网

Javascript 如何在react native中链接获取和承诺?

Javascript 如何在react native中链接获取和承诺?,javascript,api,react-native,promise,fetch,Javascript,Api,React Native,Promise,Fetch,今天,我在react原生应用程序中遇到了一个获取问题。我希望我的用户注册后直接登录。为了做到这一点,我有一个函数获取注册,另一个函数获取登录。问题是,当我在视图中单击register()按钮时,只调用注册获取。但是,如果我再次单击按钮,则会调用注册和登录获取,但注册时会发生错误,因为用户已经添加到数据库中。因此,我希望能够链接两个fetch,一个接一个。这是我的密码: api帮助程序类: const Api = { signUp(user) { return new Pro

今天,我在react原生应用程序中遇到了一个获取问题。我希望我的用户注册后直接登录。为了做到这一点,我有一个函数获取注册,另一个函数获取登录。问题是,当我在视图中单击register()按钮时,只调用注册获取。但是,如果我再次单击按钮,则会调用注册和登录获取,但注册时会发生错误,因为用户已经添加到数据库中。因此,我希望能够链接两个fetch,一个接一个。这是我的密码:

api帮助程序类:

    const Api = {

  signUp(user) {
    return new Promise((resolve, reject) =>
    {
      console.log(Constant.default.apiUrl);
      fetch(Constant.default.apiUrl + '/signup', {
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json',
        },
        body: JSON.stringify(user)
      })
        .then(response => response.json())
        .then(responseJson => {
          if (responseJson.success) {
            console.log(responseJson.userData);
            resolve(responseJson.userData);
          } else {
            reject(responseJson);
          }
        })
        .catch(err => console.log(err));
    });
  },

  login(user) {
    return new Promise((resolve, reject) => {
      fetch(Constant.default.apiUrl + '/login', {
        method : 'POST',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json',
        },
        body: JSON.stringify(user)
      })
        .then(response => response.json())
        .then(responseJson => {
          console.log("responsejson " + responseJson);
          console.log("laaaa");
          if (responseJson.success) {
            resolve(responseJson.userData);
          } else {
            reject(responseJson);
          }
        })
        .catch(err => console.log("catch login" + err))
    })
  }
};

export default Api;
注册功能(单击“注册”按钮时):

请帮我弄清楚为什么我必须在register()按钮上单击两次

提前感谢您的回答:)

编辑: 当我单击一次时,控制台中不会发生任何事情,但是用户被添加到数据库中。第二次,我看到:

我忘了提到登录和注册是完全分开的;)快速猜测。。。signup方法中的response.json()调用未在第一次单击时激发Promise.reject之前完成,第二次单击时它已完成,因此进入登录方法。这似乎类似于如果您捕捉到日志记录/调试的错误,不要忘记重新抛出它们。@ZanyCadence-我认为这段代码不会这样做-如果它这样做了,它就不会在第二次单击时使用与第一次单击时相同的注册承诺,这段代码不是这样的written@MargotLeRouzic-不是问题,但你已经爱上了
register () {

    if (this.state.password.length > 3 && this.state.password === this.state.confirmPassword) {
      var user = {
        firstName: this.props.firstName,
        lastName: this.props.lastName,
        emailAddress: this.state.emailAddress,
        password: this.state.password,
      };

      Api.signUp(user)
        .then(result => {
          console.log("sign up result : " + JSON.stringify(result));
          return {
            emailAddress : user.emailAddress,
            password : user.password
          };
           })
        .then(loginUser => {
          Api.login(loginUser)
            .then(result => {
              console.log("login result " + JSON.stringify(result));
            })
            .catch(resultErr => console.log(resultErr));
        })
        .catch(resultErr => console.log(resultErr));

    } else {
      this.setState({error: true,
        errorMessage: 'Veuillez remplir les champs correctement'});
    }
  };