【问题标题】:Method executed before 'await' method complete [duplicate]在“等待”方法完成之前执行的方法[重复]
【发布时间】: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


【解决方案1】:

你大概在寻找

async componentDidMount() {
  const permissions = await PushNotification.checkPermissions();
  console.log(permissions); 
  const authorizationStatus = permissions.alert
  console.log('Run first');

  console.log('Run after')
  this.setState({authorizationStatus});
}

你只能await一个promise,你不想传递回调。

【讨论】:

  • 传递回调而不是获得承诺不是我的选择。这是图书馆决定的。
  • @TommyLeong 好的,那么你需要自己promisify it。但从您发布的 android 声明来看,该方法似乎已经原生支持 Promise。
猜你喜欢
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2020-10-30
相关资源
最近更新 更多