JavaScript入门教程

JavaScript简介
JavaScript语法基础
JavaScript流程控制
JavaScript函数
面向对象编程
JavaScript事件
JavaScript DOM
正则表达式
JavaScript BOM
AJAX

专题分析

浏览器兼容性
JS优化
Web前端开发规范
编辑器推荐
总结和笔记

学习助手

对象参考手册
ECMAScript分析
数据中心
QQ交流群

进度通知

Promise 对象是你希望任务结束时发生的一些事。但是,你没听说过过程和结果同样重要吗?难道你不以为然吗?

幸好,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 回调。