React Native:获得许可后调用函数

时间:2018-09-12 11:57:20

标签: react-native

我只需要在获得位置许可后调用一个函数即可。 这是我的代码:

  componentDidMount() {
    this.samplePermissionRequest();
    alert('componentDidMount');
  }

  samplePermissionRequest=()=>{
    async function requestLocationPermission() {
      try {
        const granted = await PermissionsAndroid.request(
          PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
          {
            'title': 'Cool Location tracking App Permission',
            'message': 'This Cool App needs access to your location '
          }
        )
        if (granted === PermissionsAndroid.RESULTS.GRANTED) {
          this.justStart();
          alert("You can use the app");
        } else {
          alert("You can not use the app");
        }
      } catch (err) {
        console.warn(err);
      }
    }
    requestLocationPermission();
  }

  justStart=()=>{
      alert("start with permission");
  }

运行此代码时,我只会看到第一个警报的对话框(alert('componentDidMount'))。

如果我删除“ this.justStart();”行,则也会显示第二个警报。所以问题是“ this.justStart();”不起作用。

为什么?

2 个答案:

答案 0 :(得分:1)

您必须使用Promise对象,您可以像这样更改代码:

componentDidMount() {
    this.requestLocationPermission().then(
        alert('componentDidMount')
    );
}


async requestLocationPermission() {
    return PermissionsAndroid.request(
        PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
        {
            'title': 'Cool Location tracking App Permission',
            'message': 'This Cool App needs access to your location '
        }
    ).then(granted => {
        if (granted === PermissionsAndroid.RESULTS.GRANTED) {
            this.justStart();
            alert("You can use the app");
        } else {
            alert("You can not use the app");
        }
    }).catch(e => console.warn(e));
}

关于异步方法返回的承诺,您可以使用.then和.catch

答案 1 :(得分:1)

因为<input type="text" [(ngModel)]="text" class="form-control" placeholder="Search"> 将位于this函数中的undefined内。 因此requestLocationPermission将引发类型错误,该错误将由您的try / catch语句捕获。

解决方案1,

致电this.justStart()时绑定this

  

requestLocationPermission.call(this);

解决方案2,

删除函数requestLocationPermission并直接使用requestLocationPermission而不是使用内部函数并再次调用。

samplePermissionRequest

希望有帮助。