Цепные обещания с 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);
};
}