承诺和Meteor.call()

时间:2018-03-02 20:31:47

标签: javascript meteor

我有Meteor.method()服务器端从oracledb返回一个承诺。客户方我有:

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

那么result是什么?它没有.then()方法,所以它不是一个承诺?

2 个答案:

答案 0 :(得分:3)

流星没有"发送"对客户的承诺。

一旦服务器上的promise被解析(或拒绝),服务器就会将结果值返回给客户端(触发回调),而不是从方法本身返回promise(除非它已经解决)什么时候回来)。

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

以下是a blog post,其中详细介绍了在方法中使用异步代码。

注意:

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

答案 1 :(得分:1)

Meteor默认不使用promises,但是,你可以将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可让您更好地了解Aysnc / Await语法或Meteor调用中的Promises。