【问题标题】:Chain promises with then()用 then() 链式承诺
【发布时间】:2015-02-20 20:37:24
【问题描述】:

我正在使用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 函数。

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

【问题讨论】:

  • 我有一段时间没有使用when,也不知道when.lift,但我想你需要这样做:one().then(function() { return two();}).then(function() {return three();}).done();

标签: javascript promise browserify when-js


【解决方案1】:

问题是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);

【讨论】:

  • 你是 100% 正确的,我检查了这些是传入的参数 ([undefined, nodeback])。但是您有任何解决方法或解决方案吗?
  • 让我有点恼火的是,你的承诺实际上是用null 而不是undefined 解决的。我想知道when 是否混淆了这些。
  • 感谢您的帮助,请告诉我您对我的回答的看法。
  • 真的吗?关于函数原型?
  • @BenjaminGruenbaum:当然,我喜欢 :-) 当然改成function ofArity(fn, n) {… 很简单
【解决方案2】:

根据@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);
    };
}

【讨论】:

  • 我认为你应该直接使用nodefn.apply,或者将var lifted = …放在return function(){上方
  • 还要注意这个函数很聪明,但是对于有可选参数的函数来说它太聪明了。小心行事:-)
猜你喜欢
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 2017-04-06
  • 2023-03-18
  • 2016-01-21
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多