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"}).execasync 似乎 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:[...]}
});