代码非常简单:
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');
});
在原始按钮点击解决延迟后,我有兴趣通过管道功能拒绝它。
单击按钮时的预期结果是:
点击按钮时的实际结果是:
我在这里没有正确理解的是什么?我已经尝试了一百万种这种变化,无法按预期工作。
答案 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();
它会起作用。
修改强>
我发现您在代码中同时使用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。