jQuery deferred对象存在三种状态触发函数,resolve,fail,notify,分别对象成功,失败,进行中三种回调函数,当deferred不是promise对象的时候可以自行通过调用三个方法来触发不同的状态从而触发相应的回调函数。但是jquery ajax就是一个promise对象,不能手动的触发notify,查阅deferred的pipe方法,可以传递三个回调函数,对应上诉的三种状态,但是,成功,失败回调都是内部自行控制,外部不能干预,那是不是说,通过pipe的方式执行ajax是没有机会执行progress方法的呢?有的话,如何控制?如果有需要在ajax执行中添加函数的需求,如何实现呢?
解决喜欢
通过pipe的方式执行ajax是没有机会执行progress方法的呢?
if ( isSuccess ) { deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); } else { deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); }
很明显,ajax并没有调用notifyWith的地方。所以,不会有机会执行progress方法。
另外,对于XMLHttpRequest的事件而言。
onreadystatechange才能监听传输中状态,也就是触发progress方法
而jQuery.ajax使用的是onload方法,onload只在ajax加载完成才会触发。如下:
xhr.onload = callback(); xhr.onerror = callback("error");
所以,如果想要触发progress方法,需要再绑定一个事件:
xhr.onreadystatechange = function(){ if(xhr.readyState==3){ //类似于jqXHR.notifyWidth(callbackContext); } }