我正在尝试将变量“ dish_data”分配给从“ dish_ref.get()”返回的数据,这将返回一个承诺。
let dish_data;
var get_dish_data = dish_ref.get()
.then(doc => {
console.log('doc: ', doc);
console.log('doc: ', doc.data());
dish_data = doc.data();
console.log('dish_data in promise: ', dish_data);
});
console.log('dish_data after promise: ', dish_data);
const num_ratings = dish_data['num_ratings'];
“ dish_ref”是Google Firestore文档。 “ doc”和“ doc.data()”的控制台日志分别显示了Firestore文档和字典数据。控制台日志中还会在承诺内显示“ dish_data”,其中包含来自“ doc.data()”的信息,但在承诺后,“ dish_data”未定义。
我尝试如下创建异步函数...
async function myFunc() {
var get_dish_data = await dish_ref.get();
}
dish_ref.get().then(myFunc);
var dish_data = get_dish_data.data();
但是我收到一个语法错误,说函数是一个意外的令牌。
答案 0 :(得分:0)
get()
(以及所有返回promise的函数)都是异步,这意味着它们会立即返回。异步工作完成后,稍后会执行提供给then()
的回调。
您的代码看起来像是假设get()
阻止了该代码的执行,而实际上并没有。 dish_data
返回之后,访问get()
的后续代码将立即执行,这意味着它将是未定义的。在您的回调程序最终执行之前,它不会被定义。
如果要使用get()
的结果,则应仅在回调中执行此操作,或从那里将其传递给其他函数。
如果要使用async
,则还必须使用await
有效地暂停函数的执行,直到get()
产生结果。
您可以观看我有关使用promise和async / await的视频系列,这可能有助于解释问题。
https://www.youtube.com/watch?v=7IkUgCLr5oA
https://www.youtube.com/watch?v=652XeeKNHSk
https://www.youtube.com/watch?v=d9GrysWH1Lc