该代码是非常简单的前言:

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


原始按钮单击解决了延迟后,我有兴趣通过管道函数拒绝它。

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


解决
拒绝
失败


单击该按钮时的实际结果是:


解决
拒绝
做完了
然后


我在这里没有正确理解什么?我已经试过一百万个变体,但无法按预期工作。

最佳答案

.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

07-26 00:17
查看更多