流星,链接方法调用

时间:2016-09-13 12:06:42

标签: javascript meteor ecmascript-6

我有一个试图操纵数据库的Meteor方法,如果成功,则调用异步方法。我希望能够调用此方法并返回异步调用的结果或数据库操作中的错误。

这是(大致)我在服务器上的代码:

Meteor.methods({
    'data.update'(id, data) {
        Collection.update({id_: id}, {$set: {data: data}}, error => {
            if (error) {
                // Have method return Meteor error for DB-failure
            } else {
                callAsync(id, (error, res) => {
                    if (error) {
                        // Have method return Meteor error for async call failure
                    } else {
                        // Have method return success(res)
                    }
                })
            }
        })
    }
});

我读过有关期货和承诺的内容,但我对这些概念不熟悉,而且我不确定何时使用这些概念。最好是我正在寻找一种不依赖于Meteor / ES6之外的任何第三方库的解决方案。奖金(相关)问题:在数据库操作之后通常会返回什么,让我将回调附加到方法?

2 个答案:

答案 0 :(得分:3)

根据docs

  

在服务器上,如果您不提供回调,则更新阻止   直到数据库确认写入,否则抛出异常   有些不对劲。如果确实提供了回调,则返回更新   立即。更新完成后,将使用a调用回调   失败时的单个错误参数,或第二个参数   如果更新,则指示受影响的文档的数量   成功的。

因此,如果update成功,则返回受影响的文档数。如果是insert,则会返回插入文档的_id

您可以简单地将第三个参数传递给更新函数,如上所述。

对于promise实现,您可以使用Meteor.wrapAsync方法。如果您还需要传递实例变量的状态,您可能还需要查看Meteor.bindEnvironment来实现这一点。

答案 1 :(得分:1)

您可以考虑使用Promises,但在Meteor生态系统中还有另一种相当标准的处理方式。您可以使用Meteor.wrapAsync将基于异步回调的函数转换为基于Fibers的版本。这将使您可以利用返回值和异常。这是一个简单的例子:

1)假设我们有一个名为increaseLifetimeWidgetCount的内部函数,它会在某个地方增加数据库中的生命周期小部件数,然后使用错误或新更新的生命周期计数来调用回调:

function increaseLifetimeWidgetCount(callback) {
  // ...
  // increase the lifetime widget count in the DB somewhere, and 
  // get back the updated widget count, or an error.
  // ...
  const fakeError = null;
  const fakeLifetimeWidgetCount = 1000;
  return callback(fakeError, fakeLifetimeWidgetCount);
}

2)假设我们定义了一个简单的方法,它将在我们的数据库中创建一个新的Widget,调用我们的内部increaseLifetimeWidgetCount函数,然后返回新更新的生命周期小部件计数。由于我们想要返回更新的生命周期小部件计数,我们将在increaseLifetimeWidgetCount调用中包含基于回调的Meteor.wrapAsync函数,并返回结果:

Meteor.methods({
  newWidget(data) {
    check(data, Object);
    Widgets.insert(data);
    const increaseLifetimeWidgetCountFiber =
      Meteor.wrapAsync(increaseLifetimeWidgetCount);
    const lifetimeWidgetCount = increaseLifetimeWidgetCountFiber();
    return lifetimeWidgetCount;
  }
});

3)然后,我们可以通过异步回调从客户端调用newWidget方法,并处理返回的错误或返回的生命周期小部件数:

Meteor.call('newWidget', { 
  name: 'Test Widget 1' 
}, (error, result) => { 
  // Do something with the error or lifetime widget count result ...
  console.log(error, result);
});