按需链接方法

时间:2014-06-12 10:07:48

标签: javascript node.js asynchronous

标题可能非常糟糕,很抱歉:/
我有一个库,可以为我创建具有预定义功能的用户。现在,通过做类似

的工作
var User = require(...).User;
var user = new User(...);
// user has methods like which are all asymc
user.register(callback);
user.addBla(callback);

我也有包装方法,其工作方式如下:

lib.createUser.WithBla(callback)

然而,一旦你想到各种组合等,这自然会产生大量的方法。所以我有两个想法:

  1. 以某种方式使这些调用成为可连接的,而不必进行大量的回调 - 函数 - 杂耍。例如。 lib.createUser(callback).WithBla().WithBlub().WithWhatever()...
  2. 传递某种功能,例如lib.createUser({Bla:true, Blub:true}, callback)
  3. 但是我没有丝毫的线索如何实际实现它,考虑到所有这些方法都是异步的并且使用回调(我无法改变,因为它们基于节点模块请求)。

1 个答案:

答案 0 :(得分:-1)

也许并不是你的想法,但你可以使用库async

var user = new User();
user.addSomeValue = function(someValue, cb) { cb(null) }

// Execute some functions in series (one after another)
async.series([
    // These two will get a callback as their first (and only) argument.
    user.register,
    user.addBla,

    // If you need to pass variables to the function, you can use a closure:
    function(cb) { user.addSomeValue(someValue, cb); }

    // Or use .bind(). Be sure not to forget the first param ('this').
    user.addSomeValue(user, someValue)
], function(err, results) {
    if(err) throw "One of the functions failed!";
    console.log(
        "The the various functions gave these values to the callbacks:",
        results;
    );
});

结果是单个回调,而不是很多嵌套回调。

另一种选择是重新编写代码以使用Promises