Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.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/3/reactjs/21.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/2/cmake/2.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_Reactjs_React Native - Fatal编程技术网

Javascript 如何在React Native中实现回调函数?

Javascript 如何在React Native中实现回调函数?,javascript,reactjs,react-native,Javascript,Reactjs,React Native,我只是想知道如何在onPress函数中实现回调函数。我想确保第一个功能完成,然后触发第二个进程 onPress={() => { onSignIn(); //run this function first if(_values.success == 1){ //then run this after onSignIn() function completed navigation.navigate("SignedIn");

我只是想知道如何在
onPress
函数中实现回调函数。我想确保第一个功能完成,然后触发第二个进程

onPress={() => {
          onSignIn(); //run this function first
          if(_values.success == 1){ //then run this after onSignIn() function completed
            navigation.navigate("SignedIn");
          } 
        }}
onSignIn()

参考:

首先,onSign()必须是一个
async
函数,不要添加
done()
函数,要在后面处理它:

  export const onSignIn = async () => {
  if (_values.username && _values.password) { 
    fetch("http://localhost:3001/sessions/create", {
      method: "POST",
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        username: _values.username,
        password: _values.password
      })
    })
    .then((response) => response.json())
    .then((responseData) => {
      if(responseData.access_token){
         AsyncStorage.setItem(USER_KEY, responseData.access_token);
        _values.success = 1;
        alert("Login successfully!");
        return _values.success;
      } else {
        alert("Wrong username and password!");
        _values.success = 0;
        return _values.success;
      }
    })
  } else{
    throw "Please enter your username and password.";
  }
}
然后,你只要做:

onPress={() => {
          onSignIn().then( (values) => {
            if(values.success == 1){
               navigation.navigate("SignedIn");
            } 
          })
          .catch(error => console.log(error)) //do something in case onSignIn fails 
        }}

这段代码应该对您有所帮助

async onPressFunc() {
  await onSignIn(); //run this function first

  if(_values.success == 1){ //then run this after onSignIn() function completed
    navigation.navigate("SignedIn");
  } 
}

onPress={this.onPressFunc}
“wait for
onSignIn
to complete”(等待
onSignIn
完成)我想您的意思是这是一个异步函数,然后可以使用
wait
操作符等待它结束

onPress={() => {
        await onSignIn(); //run this function first
        if(_values.success == 1){ //then run this after onSignIn() function completed
            navigation.navigate("SignedIn");
        } 
    }}
然后,您需要将
async
添加到您的onSignIn函数中:

onSignIn = async () => {console.log("signing in")}
export default class Example extends Component {

    pressEvent = async event => {
        if (await onSignIn()) navigation.navigate("SignedIn");
    }

    render() {
        return (
            <div onPress={this.pressEvent}>

            </div>
        )
    }
}
这里有一个更“反应式”的方法来处理您的整个流程:

import React, { Component } from 'react'

export default class Example extends Component {

    onSignIn = async () => {
        console.log('singing in....')
    }

    pressEvent = async event => {
        await this.onSignIn(); //run this function first
        if (_values.success == 1) { //then run this after onSignIn() function completed
            navigation.navigate("SignedIn");
        }
    }

    render() {
        return (
            <div onPress={this.pressEvent}>

            </div>
        )
    }
}
现在,您将如何从该函数获取响应:

onSignIn = async () => {console.log("signing in")}
export default class Example extends Component {

    pressEvent = async event => {
        if (await onSignIn()) navigation.navigate("SignedIn");
    }

    render() {
        return (
            <div onPress={this.pressEvent}>

            </div>
        )
    }
}
导出默认类示例扩展组件{
按事件=异步事件=>{
if(wait onSignIn())navigation.navigate(“SignedIn”);
}
render(){
返回(
)
}
}

从方法返回一个承诺,并将.then()添加到函数调用中

export const onSignIn = async () => {

  const promise =  new  Promise(async (resolve, reject) => {

    try {
    //do something and return result on success
    resolve(result);

   }catch(msg) { reject(msg);}

   });

  return promise;
}
按如下方式调用该方法:

onSignIn ().then(
     (response,error) => {
     //get callback here
  });

如果我的是export const onSignIn=()=>,怎么办?到目前为止没有错误消息,但是_values.success仍然显示null。你的函数onSignIn返回了什么?你能添加代码吗@MohammadNurdin@MohammadNurdin我懂了。。。尝试我添加的更改如果我添加等待,我会收到一条错误消息。“等待是一个保留字”。您能给我们看一下
onSignIn
功能的声明吗?顺便说一句,我不想使用pressEvent功能。要确保在onPress函数中运行。仅供参考,其在组件外部运行。请检查我的回购。我想你应该从阅读React中事件的工作原理开始:你试过了吗?我收到一条错误消息。“等待”是一个保留字。