JavaScript入门教程

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

专题分析

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

学习助手

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

Promise对象向回调传递数据

Promise 对象可以向其回调提供额外的信息。举个例子,下面这两个Ajax 代码片段是等效的。
// 直接使用回调
$.get(url, successCallback);
// 将回调绑定至Promise 对象
var fetchingData = $.get(url);
fetchingData.done(successCallback);
执行或拒绝Deferred 对象时,提供的任何参数都会转发至相应的回调。
var aDreamDeferred = new $.Deferred();
aDreamDeferred.done(function(subject) {
    console.log('I had the most wonderful dream about', subject);
});
aDreamDeferred.resolve('the JS event model');
还有一些特殊的方法能实现在特定上下文中运行回调(即将this 设置为特定的值):resolveWith 和rejectWith。此时只需传递上下文环境作为第一个参数,同时以数组的形式传递所有其他参数。
var slashdotter = {
    comment: function(editor){
        console.log('Obviously', editor, 'is the best text editor.');
    }
};
var grammarDeferred = new $.Deferred();
grammarDeferred.done(function(verb, object) {
    this[verb](object);
});
grammarDeferred.resolveWith(slashdotter, ['comment', 'Emacs']);
然而,将参数打包成数组是很痛苦的。所以还有一个小窍门:不再使用resolveWith/rejectWith , 而是直接在目标上下文中调用resolve/ reject 方法,这是因为resolve/reject 可以直接将其上下文环境传递至自己所触发的回调。因此,对于前面那个例子,使用以下代码亦可得到同样的结果。
grammarDeferred.resolve.call(slashdotter, 'comment', 'Emacs');