0

代码是非常直接的前言:

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

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

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

  • 解决
  • 拒绝
  • 失败

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

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

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

4

1 回答 1

2

.pipe创建一个新的Deferred. 在您的代码中,您正在“连接” .done.then并且连接.fail到未拒绝的前一个 Deferred,这就是为什么执行.doneand.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();

它会起作用。

在这里提琴

编辑:

我看到你在你的代码中then都使用了。pipe我不知道您使用的是哪个版本的 jQuery,但请注意,自 jQuery 1.8 以来,它们是严格等效的,并且都返回一个新的 Deferred pipe。不再是and的语法糖。thenthen.done.fail

有关更多信息,请参阅jQuery 延迟和承诺 - .then() 与 .done()pipe() 以及 then() 文档与 jQuery 1.8中的现实。

于 2012-12-10T16:04:36.683 回答