首页 文章

使用firebase列表数据加载离子警报

提问于
浏览
1

问题很清楚,我需要显示一个警告列表中的元素 .

警报创建

let alert = this.alertCtrl.create({
      title: 'Elegir repartidor',
      inputs: [],
      buttons: [
        {
          text: 'Asignar',
          handler: data => {
              this.firebaseService.updateOrderAssignDeliverymen(orderKey, data);
              },
          role: 'cancel'
        }
      ]
    });
    this.firebaseService.getDeliveryMenFillAlert(alert).then(res => alert.present());

警报输入创建

getDeliveryMenFillAlert(alert: AlertController) {
    this.afd.list('/users', ref => ref.orderByChild('role').equalTo('Repartidor'))
      .snapshotChanges()
      .subscribe( res =>
        res.map(action => {
          alert.addInput({
            type: 'radio',
            label: action.payload.val().name,
            value: action.key
          })
        }),
        error => console.log(error));
  }

在阅读了很多问题之后,对于不同方法的数量感到非常惊讶......而且更令我感到惊讶的是,我无法用一个方法取得成功 .

第一次尝试

创建了第二个具有简单承诺的函数返回尝试 . 一切正常 .

getDeliveryMenFillAlert2(alert: AlertController) {
return Promise.resolve(true);
//return Promise.reject(false);

}

this.firebaseService.getDeliveryMenFillAlert2(alert)
  .then(resolve => console.log('Resolve: ' + resolve),
        reject => console.log('Reject: ' + reject));

第二次尝试

试图在我的原始函数中插入这个简单的返回当然更改对此原始函数的调用 .

getDeliveryMenFillAlert(alert: AlertController) {
this.afd.list('/users', ref => ref.orderByChild('role').equalTo('Repartidor'))
  .snapshotChanges()
  .subscribe( res =>
    res.map(action => {
      alert.addInput({
        type: 'radio',
        label: action.payload.val().name,
        value: action.key
      });
      return Promise.resolve(true);
    }),
  error => {
    console.log(error)
    return Promise.reject(false);
  });

}

但是抛出一个错误“TypeError:无法读取属性”,然后是“未定义” .

第三次尝试

为函数添加了返回Promise . 同样的错误 .

getDeliveryMenFillAlert(alert: AlertController): Promise {

Fourth attempt 阅读其中介绍async / await概念的一个问题,因此我将"async"引入了函数,"await"引入了响应 .

async getDeliveryMenFillAlert(alert: AlertController): Promise {

return await Promise.resolve(true);

Recibe另一个错误“Uncaught Error:模块解析失败:关键字'yield'被保留” .

最后一次尝试

不知道为什么但只是删除“等待”但在函数中保持“异步”,它不会检索任何错误(很棒)但调用的console.log打印“Resolve:undefined” .

所以它似乎正在解决但不起作用 .

我也尝试返回“新的Promise ...”和“true.toPromise()”而不是“return Promise.resolve(true)”,我在某处读到它但没有任何工作 . 请帮助,我努力但不能 .

FINAL SOLUTION (无法将其作为回复发布)

getDeliveryMenFillAlert(alert: AlertController) {
    return new Promise(resolve => {
    this.afd.list('/users', ref => ref.orderByChild('role').equalTo('Repartidor'))
      .snapshotChanges()
      .subscribe( res =>
        res.map(action => {
          alert.addInput({
            type: 'radio',
            label: action.payload.val().name,
            value: action.key
          });
          resolve(alert);
        }))
      });
   }

并且电话将是:

this.firebaseService.getDeliveryMenFillAlert2(alert)
      .then(resolve => alert.present());

1 回答

  • 0

    我刚刚拨打电话后拨打 alert.present()

    this.firebaseService.getDeliveryMenFillAlert(alert);
    

    如果是这样,您可能希望在显示警报之前等待回调结束 .

    • A quick fix 可能是在设置 inputs 后显示警告:
    alert.addInput({
      type: 'radio',
      label: action.payload.val().name,
      value: action.key
    });
    alert.present();
    
    • 但是 better 方式是从你的 getDeliveryMenFillAlert 函数返回一个承诺 . 并在成功回调中调用 alert.present()
    this.firebaseService.getDeliveryMenFillAlert(alert)
        .then(res => alert.present());
    

相关问题