用 then() 链式承诺
Chain promises with then()
我正在使用 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();
但是在调用第二个回调函数时报错:
Uncaught TypeError: undefined is not a function
错误指的是 twoFn(callback)
中的 callback
函数。
将这些函数链接在一起并一个接一个执行的正确方法是什么?
问题是 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);
};
}
我正在使用 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();
但是在调用第二个回调函数时报错:
Uncaught TypeError: undefined is not a function
错误指的是 twoFn(callback)
中的 callback
函数。
将这些函数链接在一起并一个接一个执行的正确方法是什么?
问题是 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);
};
}