该代码是非常简单的前言:
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
编辑:
我看到您在代码中同时使用了
then
和pipe
。我不知道您使用的是哪个版本的jQuery,但请注意,由于jQuery 1.8,pipe
和then
严格等效,并且都返回新的Deferred。 then
不再是.done
和.fail
的语法糖。有关更多信息,请参见jQuery deferreds and promises - .then() vs .done()和pipe() and then() documentation vs reality in jQuery 1.8。