Javascript Meteor,链接方法调用
我有一个Meteor方法尝试操作数据库,如果成功,则调用一个异步方法。我希望能够调用此方法并返回异步调用的结果或数据库操作的错误 这大致是我在服务器上的代码:Javascript Meteor,链接方法调用,javascript,meteor,ecmascript-6,Javascript,Meteor,Ecmascript 6,我有一个Meteor方法尝试操作数据库,如果成功,则调用一个异步方法。我希望能够调用此方法并返回异步调用的结果或数据库操作的错误 这大致是我在服务器上的代码: Meteor.methods({ 'data.update'(id, data) { Collection.update({id_: id}, {$set: {data: data}}, error => { if (error) { // Have m
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之外的任何第三方库的解决方案。奖金相关问题:在数据库操作之后,让我将回调附加到一个方法,通常会返回什么?您可以研究使用承诺,但在Meteor生态系统中,有另一种相当标准的方法来处理类似的事情。可以使用将基于异步回调的函数转换为基于回调的版本。这样就可以利用返回值和异常。下面是一个简单的例子: 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假设我们定义了一个简单的方法,该方法将在数据库中创建一个新的小部件,调用我们的内部increaseLifetimeWidgetCount函数,然后返回新更新的生存期小部件计数。由于我们希望返回更新的生存期小部件计数,因此我们将在Meteor.wrapAsync调用中包装基于回调的increaseLifetimeWidgetCount函数,并返回结果:
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);
});
你可以考虑使用承诺,但在Meteor生态系统中还有另一种相当标准的方式来处理类似的事情。可以使用将基于异步回调的函数转换为基于回调的版本。这样就可以利用返回值和异常。下面是一个简单的例子: 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假设我们定义了一个简单的方法,该方法将在数据库中创建一个新的小部件,调用我们的内部increaseLifetimeWidgetCount函数,然后返回新更新的生存期小部件计数。由于我们希望返回更新的生存期小部件计数,因此我们将在Meteor.wrapAsync调用中包装基于回调的increaseLifetimeWidgetCount函数,并返回结果:
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);
});
据
在服务器上,如果不提供回调,则更新块
直到数据库确认写入,或者在
出了点问题。如果确实提供了回调,则update将返回
立即更新完成后,将使用
失败情况下的单个错误参数,或第二个参数
指示更新失败时受影响文档的数量
成功
因此,如果更新成功,将返回受影响的文档数。如果是insert,则返回插入文档的_id
如前所述,您只需将第三个参数传递给update函数即可
对于promise实现,可以使用Meteor.wrapAsync方法。如果还需要传递实例变量的状态,您可能还需要查看Meteor.bindEnvironment来实现这一点。根据
在服务器上,如果不提供回调,则更新块
直到数据库确认写入,或者在
出了点问题。如果确实提供了回调,则update将返回
立即更新完成后,将使用
失败情况下的单个错误参数,或第二个参数
指示更新失败时受影响文档的数量
成功
因此,如果更新成功,将返回受影响的文档数。如果是insert,则返回插入文档的_id
如前所述,您只需将第三个参数传递给update函数即可
对于promise实现,可以使用Meteor.wrapAsync方法。如果还需要传递实例变量的状态,您可能还需要查看Meteor.bindEnvironment来实现这一点。除了术语之外,未来和承诺之间没有区别吗?虽然在JS中我们称之为承诺,是的,你应该返回一个。正如我所说的,我对这些概念还不熟悉。我知道在Scala中它们是不同的,但相关的概念,维基百科说未来和承诺起源于函数编程和相关的paradig
ms,比如逻辑编程,将未来的价值与承诺的计算方式分离。JS中期货和承诺的一大区别是,你只能在谷歌上搜索后者;。是的,在JS中有点奇怪。我们谈论的是延期和承诺,而不是承诺和未来,而且延期正逐渐被淘汰,取而代之的是纯粹的回调。我明白了:。无论如何,如果你对我在这种情况下应该如何使用承诺有一个很好的答案,请随意写一个答案,我会接受的。我对meteor不太了解,所以我恐怕在这里帮不了你。除了术语之外,未来和承诺没有区别?虽然在JS中我们称之为承诺,是的,你应该返回一个。正如我所说的,我对这些概念还不熟悉。我知道,在Scala中,它们是不同但相关的概念,Wikipedia说,未来和承诺起源于函数编程和相关范例,如逻辑编程,将未来的价值与承诺的计算方式分离。JS中期货和承诺的一大区别是,你只能在谷歌上搜索后者;。是的,在JS中有点奇怪。我们谈论的是延期和承诺,而不是承诺和未来,而且延期正逐渐被淘汰,取而代之的是纯粹的回调。我明白了:。无论如何,如果你对我在这种情况下应该如何使用承诺有一个很好的答案,请随意写一个答案,我会接受的。我对meteor不够了解,所以我恐怕在这里帮不了你。