【问题标题】:Promises and Meteor.call()承诺和 Meteor.call()
【发布时间】:2018-03-05 23:56:07
【问题描述】:

我有一个Meteor.method(),服务器端返回来自oracledb 的承诺。我有客户端:

Meteor.call('myMethod', (error, result) => {
  result.then() // err -> no .then() method?, 
});

那么result 是什么?它没有.then() 方法,所以不是promise?

【问题讨论】:

标签: javascript meteor


【解决方案1】:

Meteor 不会向客户端“发送”承诺。

一旦在服务器上解决(或拒绝)promise,服务器就会向客户端返回一个结果值(触发回调),而不是在从方法本身返回promise的那一刻(除非它已经解决返回时)。

您还可以使用 async/await 来简化代码。

这里是a blog post,其中包含有关在方法中使用异步代码的更多详细信息。

注意:

从服务器发送的值使用 EJSON 进行序列化。对象方法、getter 等被从中剥离,除非您创建一个custom serializer。在某些情况下,序列化甚至可能会失败(我认为它发生在某些 moment 对象上)并导致 undefined 被返回。

【讨论】:

  • 所以我认为在解决承诺之前返回值,因此 result 缺少它的 getter 方法?
  • 你不能从 Meteor 方法返回一个不可序列化的对象。它必须是 EJSON 可序列化的,因此,除非您有自定义序列化程序,否则您不能拥有带有 getter 的对象。如果你愿意,你可以分享更具体的代码,我会试着解释发生了什么。
  • 啊,这可能是解释。在 Chrome 中调试时,我想知道为什么对象的属性填充了预期值,但 getter 方法返回了undefined。现在,在 Chrome 开发工具中,日食 (...) 显示在 getter 方法旁边,如果您单击这些,则会评估预期值 - 因此我认为这是一个异步问题。
  • AAAArrgggh!这一直是我的问题,为什么Meteor在序列化不可序列化的对象时不会警告我!!!
  • 我添加了一条注释。
【解决方案2】:

默认情况下,Meteor 不使用 Promise,但是,您可以将 Meteor.calls 包装到如下所示的 Promise 函数中

const callWithPromise = (method, myParameters) => {
  return new Promise((resolve, reject) => {
    Meteor.call(method, myParameters, (err, res) => {
      if (err) reject('Something went wrong');
      resolve(res);
    });
  });
}

(async function() {
  const myValue1 = await callWithPromise('myMethod1', someParameters);
  const myValue2 = await callWithPromise('myMethod2', myValue1);
})();

示例代码复制自Meteor forum

此外,this topic 让您更好地了解如何在 Meteor 调用中利用 Aysnc/Await 语法或 Promises。

【讨论】:

    猜你喜欢
    • 2015-05-12
    • 2023-03-26
    • 1970-01-01
    • 2021-08-15
    • 2015-12-30
    • 2019-05-03
    • 2016-03-04
    • 1970-01-01
    • 2015-10-06
    相关资源
    最近更新 更多