Nodejs: 水线 + Caolan/Async: 绑定函数
Nodejs: Waterline + Caolan/Async: bind function
使用 Balderdashy/Waterline and Caolan/Async,我正在尝试并行处理多个 Waterline 查询。到目前为止,我找到的较短的是:
const tasks = {
foos: (function(){return this.exec.bind(this);}).apply(Foo.find({foo: "foo"})),
bars: (function(){return this.exec.bind(this);}).apply(Bar.find({bar: "bar"}))
};
return async.parallel(tasks, function(err, out){
// Here, err contains the potential error, and out looks like {foos:[...],bars:[...]}
});
我试过 bars: Bar.find({bar: "bar"}).exec
但 async
似乎 apply
以另一个对象作为作用域的函数...所以我找不到方法来做到这一点shorter/simpler 方式。
请注意,我想避免自己将函数包装在另一个函数中,因为我想为它找到替代语法:
bars: function(cb){Bar.find({bar: "bar"}).exec(cb)}
感谢您的帮助。
Waterline 的 Deferred
是 thenables,因此您可以并且应该将它们与 promise 一起使用。 bluebird 是一个很好的实现。
return bluebird.props({
foos: Foo.find({foo: "foo"}),
bars: Bar.find({bar: "bar"})
}).then(function (out) {
// …
});
是的,即使您通常想要回调。
return bluebird.props({
foos: Foo.find({foo: "foo"}),
bars: Bar.find({bar: "bar"})
}).asCallback(function (err, out) {
// …
});
如果尽管 Waterline 已经在使用 promises 但你有充分的理由不能使用它们,我想你可以在 Deferred
原型上附加一些东西:
var Deferred = require('waterline/lib/waterline/query/deferred').Deferred;
Object.defineProperty(Deferred.prototype, 'execBound', {
configurable: true,
get: function () {
return this.exec.bind(this);
}
});
用作:
const tasks = {
foos: Foo.find({foo: "foo"}).execBound,
bars: Bar.find({bar: "bar"}).execBound
};
return async.parallel(tasks, function(err, out){
// Here, err contains the potential error, and out looks like {foos:[...],bars:[...]}
});
使用 Balderdashy/Waterline and Caolan/Async,我正在尝试并行处理多个 Waterline 查询。到目前为止,我找到的较短的是:
const tasks = {
foos: (function(){return this.exec.bind(this);}).apply(Foo.find({foo: "foo"})),
bars: (function(){return this.exec.bind(this);}).apply(Bar.find({bar: "bar"}))
};
return async.parallel(tasks, function(err, out){
// Here, err contains the potential error, and out looks like {foos:[...],bars:[...]}
});
我试过 bars: Bar.find({bar: "bar"}).exec
但 async
似乎 apply
以另一个对象作为作用域的函数...所以我找不到方法来做到这一点shorter/simpler 方式。
请注意,我想避免自己将函数包装在另一个函数中,因为我想为它找到替代语法:
bars: function(cb){Bar.find({bar: "bar"}).exec(cb)}
感谢您的帮助。
Waterline 的 Deferred
是 thenables,因此您可以并且应该将它们与 promise 一起使用。 bluebird 是一个很好的实现。
return bluebird.props({
foos: Foo.find({foo: "foo"}),
bars: Bar.find({bar: "bar"})
}).then(function (out) {
// …
});
是的,即使您通常想要回调。
return bluebird.props({
foos: Foo.find({foo: "foo"}),
bars: Bar.find({bar: "bar"})
}).asCallback(function (err, out) {
// …
});
如果尽管 Waterline 已经在使用 promises 但你有充分的理由不能使用它们,我想你可以在 Deferred
原型上附加一些东西:
var Deferred = require('waterline/lib/waterline/query/deferred').Deferred;
Object.defineProperty(Deferred.prototype, 'execBound', {
configurable: true,
get: function () {
return this.exec.bind(this);
}
});
用作:
const tasks = {
foos: Foo.find({foo: "foo"}).execBound,
bars: Bar.find({bar: "bar"}).execBound
};
return async.parallel(tasks, function(err, out){
// Here, err contains the potential error, and out looks like {foos:[...],bars:[...]}
});