流星,链接方法调用
Meteor, chaining method calls
我有一个尝试操作数据库的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)
}
})
}
})
}
});
我读过关于未来和承诺的书,但我对这些概念不熟悉,我不确定什么时候用什么。最好我正在寻找一个解决方案,不依赖于任何第三方库以外的流星/ES6。附加(相关)问题:在数据库操作之后,通常会返回什么,让我们将回调附加到一个方法?
根据docs
在服务器上,如果你不提供回调,那么更新块直到数据库确认写入,否则抛出异常出了什么问题。如果你提供了回调,update返回立即。更新完成后,回调函数将被调用失败时使用单个错误参数,或者使用第二个参数如果更新是,则指示受影响文档的数量成功。
因此,如果update
成功,则返回受影响的文档数量。如果是insert
,则返回插入文档的_id
。
您可以简单地将第三个参数传递给如上所述的更新函数。
对于承诺实现,可以使用Meteor.wrapAsync
方法。如果您也需要传递实例变量的状态,您可能还需要查看Meteor.bindEnvironment
来实现这一点。
您可以考虑使用Promises,但是在Meteor生态系统中还有另一种相当标准的方法来处理类似的事情。您可以使用Meteor.wrapAsync
将基于异步回调的函数转换为基于光纤的版本。这样就可以利用返回值和异常。下面是一个简单的例子:
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
函数,然后返回新更新的生命周期Widget计数。由于我们希望返回更新的生命周期小部件计数,因此我们将基于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);
});
- 未捕获错误:无法在初始化之前调用方法;
- 通过ajax从客户端调用C#方法来执行C#方法
- 如何避免在angular上多次调用方法;s ng重复
- React路由器错误-'无法调用方法'getRouteAtDepth'的未定义'
- 从window.onbeforeunload调用方法背后的代码
- 当输入字段为空时,如何在angular中调用方法
- 函数调用方法有什么用
- 多次调用方法后返回相同promise的模式
- 当从Chrome扩展动态注入JS时,从onload()内部调用方法
- 茉莉花 - 未调用方法
- jQuery如何在原型中调用方法
- ng显示“;调用方法“;不起作用
- Odoo销售点如何访问模型并使用JS调用方法
- 从React调用方法.JS州
- TinyMCE验证给出错误:无法调用方法'getContent'的未定义
- 向模板实例变量传递调用方法调用的结果时出现异常
- 如何在对象中调用方法
- 检查对话框是否为 Open 会引发“初始化前无法在对话框上调用方法”错误
- 在输入类型提交按钮上调用 C# 方法
- 通过类选择器单独调用方法