【问题标题】:Variable stays undefined after assigning within Promise [duplicate]在 Promise 中分配后变量保持未定义 [重复]
【发布时间】:2018-08-08 19:28:07
【问题描述】:

我正在尝试将变量“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()”的信息,但在 promise 内但在 promise 之后,“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();

但我得到一个语法错误,说函数是一个意外的标记。

【问题讨论】:

  • 只要把所有使用promise结果的代码都放在回调里面
  • 我决定采用这条路线,但它确实让我的代码更加混乱。我更喜欢使用 async 和 await 但就像我在帖子中写的那样,我不断收到语法错误,经过一番谷歌搜索后,看起来过时的 Node 版本是罪魁祸首,但我使用的是最新版本的 Node,所以我不知道是什么问题。

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


【解决方案1】:

get()(以及所有返回承诺的函数)是异步的,这意味着它们会立即返回。提供给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

【讨论】:

  • 这些视频很有帮助。谢谢!
猜你喜欢
  • 2021-02-16
  • 1970-01-01
  • 2016-03-19
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 2018-07-19
  • 2017-05-28
相关资源
最近更新 更多