1

我正在对我的节点样式回调使用when承诺库并承诺它们......lift()

var nodefn = require('when/node');

var one = nodefn.lift(oneFn),
    two = nodefn.lift(twoFn),
    three = nodefn.lift(threeFn);


function oneFn(callback){
    console.log('one');
    callback(null);
}

function twoFn(callback){
    console.log('two');
    callback(null);
}

function threeFn(callback){
    console.log('three');
    callback(null);
}

我想调用链​​中的函数,如下所示:

one().then(two).then(three).done();

但是在调用第二个回调函数时它给了我一个错误:

未捕获的类型错误:未定义不是函数

callback该错误是指twoFn(callback).

将这些功能链接在一起并一个接一个地执行的正确方法是什么?

4

2 回答 2

2

问题是它nodefn.lift不知道函数有多少参数(零),所以它只接受出现的参数并将其回调附加到它们。在then链中,每个回调都会收到前一个承诺的结果(在您的情况下:) undefined,因此您twofn将使用两个参数调用:undefined和 nodeback。

所以如果你修复他们的arities,它应该可以工作:

Function.prototype.ofArity = function(n) {
    var fn = this, slice = Array.prototype.slice;
    return function() {
        return fn.apply(null, slice.call(arguments, 0, n));
    };
};
var one = nodefn.lift(oneFn).ofArity(0),
    two = nodefn.lift(twoFn).ofArity(0),
    three = nodefn.lift(threeFn).ofArity(0);
于 2015-02-20T12:22:58.870 回答
0

根据@Bergi 的回答,我编写了这个函数:

function nodeLift(fn){
    return function(){
        var args = Array.prototype.slice.call(arguments, 0, fn.length - 1),
            lifted = nodefn.lift(fn);

        return lifted.apply(null, args);
    };
}
于 2015-02-20T12:37:24.010 回答