Цепные обещания с then()

Я использую библиотеку, когда обещают 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();

Но это вызывает ошибку при вызове второй функции обратного вызова:

Uncaught TypeError: undefined не является функцией

Ошибка относится к callback функционировать в twoFn(callback),

Как правильно связать эти функции вместе и выполнять одну за другой?

2 ответа

Решение

Проблема в том, что nodefn.lift не знает, сколько параметров имеет функция (ноль), поэтому она просто принимает появляющиеся аргументы и добавляет к ним свой обратный вызов. В then по цепочке каждый обратный вызов получает результат предыдущего обещания (в вашем случае: undefined), Так что ваши twofn будет вызываться с двумя аргументами: undefined и нодбэк.

Так что, если вы исправите их артерии, это должно работать:

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);

Основываясь на ответе @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);
    };
}
Другие вопросы по тегам