幸好,jQuery 团队意识到了这一点并遵守Promises/A 规范,于是在jQuery 1.7 中为Promise 对象新添了一种可以调用无数次的回调。这个回调叫做progress(进度)。举个例子,假设有人正在奋力达成美国全国小说写作月( National Novel Writing Month , 简写为NaNoWriMo)①项目设定的日均码字目标,而我们希望更新一个指示器以反映他距离实现这个目标还有多远。
var nanowrimoing = $.Deferred(); var wordGoal = 5000; nanowrimoing.progress(function(wordCount) { var percentComplete = Math.floor(wordCount / wordGoal * 100); $('#indicator').text(percentComplete + '% complete'); }); nanowrimoing.done(function(){ $('#indicator').text('Good job!'); });Deferred 对象的nanowrimoing 准备就绪之后,可以像下面这样对字数的变化作出响应。
$('#document').on('keypress', function(){ var wordCount = $(this).val().split(/\s+/).length; if (wordCount >= wordGoal) { nanowrimoing.resolve(); }; nanowrimoing.notify(wordCount); });Deferred 对象的notify(通知)调用会调用我们设定的progress回调。就像resolve 和reject 一样,notify 也能接受任意参数。
请注意,一旦执行了nanowrimoing 对象,则再作nanowrimoing.notify 调用将不会有任何反应,这就像任何额外的resolve 调用及reject 调用也会被直接无视一样。
简单总结一下,Promise 对象接受3 种回调形式:done、fail 和progress。执行Promise 对象时,运行的是done 回调;拒绝Promise对象时,运行的是fail 回调;对处于挂起状态的Deferred 对象调用notify 时,运行的是progress 回调。