如果之前的管道已解析,则无法拒绝使用管道函数延迟的jquery

时间:2012-12-10 10:08:49

标签: javascript jquery jquery-deferred

代码非常简单:

  var handleNextPressedDeferred = $.Deferred();
  $('input:button').live('click',function(){
    console.log('resolving');
    return handleNextPressedDeferred.resolve();
  });

  handleNextPressedDeferred.pipe(function(){
    console.log('rejecting');
    return $.Deferred().reject();
  });

  var handleNextPressedPromise = handleNextPressedDeferred.promise();

  handleNextPressedPromise.done(function(){
    console.log('done');
  });
  handleNextPressedPromise.then(function(){
    console.log('then');
  });
  handleNextPressedPromise.fail(function(){
    console.log('fail');
  });

在原始按钮点击解决延迟后,我有兴趣通过管道功能拒绝它。

单击按钮时的预期结果是:

  • 解决
  • 拒绝
  • 失败

点击按钮时的实际结果是:

  • 解决
  • 拒绝
  • 完成
  • 然后

我在这里没有正确理解的是什么?我已经尝试了一百万种这种变化,无法按预期工作。

1 个答案:

答案 0 :(得分:2)

.pipe创建一个新的Deferred。在您的代码中,您将.done.then.fail“连接”到之前未被拒绝的Deferred,这就是执行.done.then的原因.fail

尝试替换它:

handleNextPressedDeferred.pipe(function(){
    console.log('rejecting');
    return $.Deferred().reject();
});

var handleNextPressedPromise = handleNextPressedDeferred.promise();

通过

var handleNextPressedPromise = handleNextPressedDeferred.pipe(function(){
    console.log('rejecting');
    return $.Deferred().reject();
}).promise();

它会起作用。

Fiddle here

修改

我发现您在代码中同时使用thenpipe。我不知道你正在使用哪个版本的jQuery,但要小心,因为jQuery 1.8,pipethen是严格等效的,并返回一个新的Deferred。 then不再是.done.fail的语法糖。

有关详细信息,请参阅jQuery deferreds and promises - .then() vs .done()pipe() and then() documentation vs reality in jQuery 1.8