在Promise中分配后,变量保持未定义状态

时间:2018-08-08 19:28:07

标签: javascript node.js promise google-cloud-firestore

我正在尝试将变量“ 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();

但是我收到一个语法错误,说函数是一个意外的令牌。

1 个答案:

答案 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

https://www.youtube.com/watch?v=TCYhr_UMZkI

https://www.youtube.com/watch?v=Jr7pDZ1RAUg