.then()与.done()
我一直在阅读关于jQuery的延期和承诺,我看不到使用.then()
和.done()
成功回调之间的区别。 我知道Eric Hynds提到.done()
和.success()
映射到相同的功能,但是我猜测.success()
也是如此.then()
因为所有的回调都是在成功操作完成时调用的。
任何人都可以请启发我正确的用法?
非常感谢
附加到done()
的回调将在延迟解析时触发。 附加到fail()
的回调将在延迟被拒绝时触发。
在jQuery 1.8之前, then()
只是语法糖:
promise.then( doneCallback, failCallback )
// was equivalent to
promise.done( doneCallback ).fail( failCallback )
从1.8开始, then()
是pipe()
的别名,并返回一个新的promise,请参阅这里以获取有关pipe()
更多信息。
success()
和error()
仅在通过调用ajax()
返回的jqXHR
对象上可用。 它们分别是done()
和fail()
简单别名:
jqXHR.done === jqXHR.success
jqXHR.fail === jqXHR.error
另外, done()
并不局限于单个回调函数,它将过滤非函数(尽管1.8版本中的字符串存在一个bug,应该在1.8.1中修正)。
// this will add fn1 to 7 to the deferred's internal callback list
// (true, 56 and "omg" will be ignored)
promise.done( fn1, fn2, true, [ fn3, [ fn4, 56, fn5 ], "omg", fn6 ], fn7 );
同样fail()
。
处理返回结果的方式也有所不同(它称为链接, done
不产生链接, then
产生调用链)
promise.then(function (x) { // Suppose promise returns "abc"
console.log(x);
return 123;
}).then(function (x){
console.log(x);
}).then(function (x){
console.log(x)
})
以下结果将被记录:
abc
123
undefined
而
promise.done(function (x) { // Suppose promise returns "abc"
console.log(x);
return 123;
}).done(function (x){
console.log(x);
}).done(function (x){
console.log(x)
})
将得到以下内容:
abc
abc
abc
----------更新:
顺便说一句。 我忘了提及,如果你返回一个Promise而不是原子类型的值,那么外层承诺将等到内层承诺解决为止:
promise.then(function (x) { // Suppose promise returns "abc"
console.log(x);
return $http.get('/some/data').then(function (result) {
console.log(result); // suppose result === "xyz"
return result;
});
}).then(function (result){
console.log(result); // result === xyz
}).then(function (und){
console.log(und) // und === undefined, because of absence of return statement in above then
})
通过这种方式,构成并行或连续的异步操作变得非常简单,例如:
// Parallel http requests
promise.then(function (x) { // Suppose promise returns "abc"
console.log(x);
var promise1 = $http.get('/some/data?value=xyz').then(function (result) {
console.log(result); // suppose result === "xyz"
return result;
});
var promise2 = $http.get('/some/data?value=uvm').then(function (result) {
console.log(result); // suppose result === "uvm"
return result;
});
return promise1.then(function (result1) {
return promise2.then(function (result2) {
return { result1: result1, result2: result2; }
});
});
}).then(function (result){
console.log(result); // result === { result1: 'xyz', result2: 'uvm' }
}).then(function (und){
console.log(und) // und === undefined, because of absence of return statement in above then
})
上面的代码并行发出两个http请求,从而使得请求更快完成,而低于这些http请求的请求将顺序运行,从而减少服务器负载
// Sequential http requests
promise.then(function (x) { // Suppose promise returns "abc"
console.log(x);
return $http.get('/some/data?value=xyz').then(function (result1) {
console.log(result1); // suppose result1 === "xyz"
return $http.get('/some/data?value=uvm').then(function (result2) {
console.log(result2); // suppose result2 === "uvm"
return { result1: result1, result2: result2; };
});
});
}).then(function (result){
console.log(result); // result === { result1: 'xyz', result2: 'uvm' }
}).then(function (und){
console.log(und) // und === undefined, because of absence of return statement in above then
})
.done()
只有一个回调函数,它是成功的回调函数
.then()
具有成功和失败回调
.fail()
只有一个失败回调
所以这取决于你你必须做什么......你关心它是否成功或失败了吗?
链接地址: http://www.djcxy.com/p/9427.html上一篇: .then() vs .done()
下一篇: What is the best way to add options to a select from as a JS object with jQuery?