我正在尝试使用TypeScript制作Firebase云功能。我有以下使用诺言的代码:
const pro_books = new Promise((resolve,reject)=>{
resolve(db.child("Books").orderByChild("avg_rating").limitToFirst(15));
})
pro_books
.catch((error) => {
console.log("Recommendations: Error loading books");
})
.then((list_book) => {
book_id_arr = (list_book).map((x:string)=>{
const book:Book = JSON.parse(x);
return book.id;
})
}).catch(() => 'obligatory catch');
问题在于映射功能,特别是对于list_book(在try块内的第一行),并且我得到的错误(在构建过程中)是“对象的类型为'未知'”。 list_book应该是我运行的查询的结果,所以它可能是某种类型的JSON文档数组,我尝试强制使用一种类型,但我不知道确切的操作方法以及使用的类型。>
编辑:book_id_arr先前定义为let book_id_arr:String[] = new Array();
答案 0 :(得分:0)
db.child("Books").orderByChild("avg_rating").limitToFirst(15)
不是Query
的结果。它只是查询的声明。
如果要获得结果,则需要调用get()
方法或set a listener。
在您的情况下,您应该使用get()
方法,该方法会返回一个将用QuerySnapshot
进行解析的Promise,因此您无需将其包装在新的Promise中。
如果要在结果map()
上使用QuerySnapshot
,则需要调用其docs
属性,该属性返回“ QuerySnapshot中所有文档的数组”。
以下应该可以解决问题:
const pro_books_query = db.child("Books").orderByChild("avg_rating").limitToFirst(15);
return pro_books_query.get()
.then((list_book) => {
book_id_arr = list_book.docs.map(...);
return ...
})
.catch(err =>
console.log("Recommendations: Error loading books - " + err);
return null;
);