在前端这个范畴内里,ajax要求异常罕见,置信每个前端er都写过下面的代码:
// 条件引入jquery
$.ajax({
type: 'get',
url: '/path/to/data',
success: function (response) {
},
error: function (errMsg) {
}
})
上面这段代码中的success和error被称为回调函数。基于js异步IO的特性,代码的意义就是在ajax要求胜利以后,实行success函数,而在ajax失利时,实行error函数。
但是在有些情况下,营业逻辑可以须要我们发生多个success状况下的回调函数,或许多个ajax要求同时发送,悉数success状况后实行回调,如许的要领就显得有些左支右绌。
1. 单次ajax要求有多个回调相应
// 运用上面的要领,有以下两种营业逻辑
$.ajax({
type: 'get',
url: '/path/to/data',
success: function (response) {
// todo
successCallback2(response);
successCallback3(response);
}
})
继承运用上面的写法,就会让回调举行嵌套,假如须要在successCallback2完成后继承回调,就要一层一层的嵌套。代码不是纵向生长,而是横向生长,这就是js中的回调地狱。
2. 多个ajax要求愿望有一个配合的回调相应
// 继承运用最初的要领,假设有多个ajax要求,愿望在悉数完成后实行回调函数。
function fetchData (url, successCb, errorCb) {
return function () {
$.ajax({
type: 'get',
url: url,
success: successCb,
error: errorCb
});
}
}
function successCb () {
console.log('success');
}
function errorCb () {
console.log('error');
}
var fetchData1 = fetchData('/path/to/data1', successCb, errorCb);
var fetchData2 = fetchData('/path/to/data2', successCb, errorCb);
假如有两个雷同的fetch data的操纵,假如我们愿望可以并行操纵的话,只能重写fetchData1
var fetchData1 = fetchData('/path/to/data1', fetchData2, errorCb);
fetchData1();
这类写法实际上是在fetchData1胜利后举行fetchData2操纵的,并非严厉意义上的并行操纵,以后在fetchData2的success状况的回调中,我们可以获得两次ajax要求的返回值。
如许的代码是不完美的,在现在人人都在寻求webpack+es6+babel的手艺栈时,也应当想一想,怎样从最基本的代码中提拔生产力和代码的可维护性。
在发现了代码在营业中的痛点以后,就要想办法去处理它。幸亏现在前端百花齐放,如许的题目早已有多种成熟的处理计划,接下来的几篇文章,就由浅入深细致的讲讲这些异步计划中的完成要领和代码道理,而且每一种要领本人都完成了一个tiny版。一切文章代码都开源在github上,假如有任何题目或许发起以至是毛病,都可以在github中提issue给我。迎接人人热闹议论。
下一篇最先,偏重引见详细从Deferred对象处理上述两种题目,有兴致的同砚继承看下去吧。Javascript异步编程-耽误对象篇