1. promise有什么用
promise提供了对js异步编程的新的解决方案。
- 他改变了传统回调的位置,不用去思考那些难缠的回调嵌套,让我们在思维上更容易理解回调,让回调更容易编写和维护。
- 统一了回调的接口,让各种回调更易使用,而不用去看细看的各个回调函到底是什么。
2. promise如何实现
Promise是一个对象,可以通过构造函数生成。
new Promise(function(resolve,reject){
//一些异步操作
if(异步成功){
resolve.call(undefined,text)//修改实例化的promise对象的状态为fulfilled,
}else(异步失败){
reject.call(undefined,error)//修改实例化的promise对象的状态为rejected,
}
}).then(fn1,fn2)//then 方法添加了两个回调函数,第一个异步成功时调用,第二个异步失败时调用
- promise有三种状态,两种状态变化,变化后固定不可变。
- resolve()方法改变promise状态pending-->fulfilled,传出一个参数text,并立马调用then()方法中第一个函数
- reject()方法改变promise状态pending-->rejected,传出一个参数error,并立马调用then()方法中第二个函数
- then()方法用来添加回调函数。
3. promise执行顺序
- promise实例里的代码为同步任务,先执行;
- then()方法里的代码为微任务,在promise本次循环结束后立马执行;
- 最后是正常的异步任务,比如setTimeout()等。
4. 用promise写一个jQuery.ajax
window.jQuery = function(nodeOrSelector){
nodes = {}
nodes.addClass = function(){}
nodes.text = function(){}
return nodes
}
window.$ = window.jQuery
jQuery.ajax = function({url,method,body}){
return new Promise(function(resolve,reject){
let request = new XMLHttpRequest()
request.open(method,url)
request.onreadystatechange = () =>{
if(request.readyState === 4){
if(request.states >= 200 && request.states <300){
resolve.call(undefined,request.responseText)
}else if(request.states >= 400){
reject.call(undefined,request)
}
}
}
request.send(body)
})
}
var success = function(text){console.log(text)}
var fail = function(error){console.log(error)}
//使用有promise功能的ajax
jQuery.ajax({
url:'/xxx',
method: 'post',
body:"a=1&b=2"
}).then{success,fail}