【发布时间】:2020-12-07 05:46:10
【问题描述】:
尝试在从checkPermissions() 返回值后执行 setState,但是 async-await 没有完成这项工作。
我在这里找不到任何不正确的地方,你能指出我的错误吗?
仅供参考checkPermissions() 接受回调函数作为参数。
async componentDidMount() {
let authorizationStatus = false;
await PushNotification.checkPermissions(function(permissions) {
console.log(permissions);
authorizationStatus = permissions.alert
console.log('Run first')
});
console.log('Run after')
this.setState({
authorizationStatus,
});
}
检查权限代码 (Android)
@ReactMethod
public void checkPermissions(Promise promise) {
ReactContext reactContext = getReactApplicationContext();
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(reactContext);
promise.resolve(managerCompat.areNotificationsEnabled());
}
解决方案尝试但失败:
只有Run first 被打印出来,Run after 没有。
async componentDidMount() {
let authorizationStatus = false;
PushNotification.checkPermissions(function(permissions) {
console.log(permissions);
authorizationStatus = permissions.alert
console.log('Run first')
this.setState({
authorizationStatus,
},()=>{console.log('Run after')});
});
}
【问题讨论】:
-
如果它接受一个回调函数,它还没有被承诺。这意味着它不会返回 Promise,并且将
await放在前面没有任何效果。此处的修复很简单:只需将setState部分移动到回调中。 -
PushNotification.checkPermissions是否真的将Promise返回为awaited? -
@ChrisG 更新了问题。我之前实际上尝试过,但是 setState 没有被执行。
-
authorizationStatus后面有一个逗号,但我看不出它会打印Run first而不是Run after。您是在向我们展示实际代码吗?还是您在此处针对问题进行了编辑? -
我假设您收到的是
this.setState is not a function?那是因为您需要使用箭头函数,否则this不再指向您的 Component 实例。如果你这样做,它工作正常:codesandbox.io/s/nostalgic-cdn-tw8dd?file=/src/App.js
标签: javascript react-native asynchronous async-await react-native-push-notification