【发布时间】:2018-08-21 14:31:34
【问题描述】:
问题很明确,我需要显示一个带有 firebase 列表元素的警报。
警报创建
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));
}
在阅读了许多问题后,对不同方法的数量感到非常惊讶......更惊讶的是我无法成功地使用一种方法。
第一次尝试
创建了第二个函数,带有一个简单的 promise return 来尝试。一切正常。
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: Cannot read property 'then' of undefined”。
第三次尝试
在函数中添加了 return Promise。同样的错误。
getDeliveryMenFillAlert(alert: AlertController): Promise {
第四次尝试 阅读其中一个问题,它介绍了 async/await 概念,所以我在函数中引入了“async”,在响应中引入了“await”。
async getDeliveryMenFillAlert(alert: AlertController): Promise {
return await Promise.resolve(true);
Recibe 另一个错误“未捕获的错误:模块解析失败:保留关键字 'yield'”。
最后一次尝试
不知道为什么,只是删除了“await”,但在函数中保留了“async”,它没有检索到任何错误(很好),但是调用的 console.log 打印了“Resolve: undefined”。
所以它似乎正在解决但不起作用。
我还尝试返回“new Promise...”和“true.toPromise()”而不是“return Promise.resolve(true)”,我在某处读到它,但没有任何效果。请大家帮忙,我正在努力但做不到。
最终解决方案(不能作为回复发布)
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());
【问题讨论】:
标签: javascript firebase ionic-framework firebase-realtime-database angularfire2