声明,只是简朴地提了提promise的基础运用,大牛绕道^_^
1.先看一个例子
你须要晓得1.axios是个库
2.axios()返回一个Promise实例
3.你能够把axios()明白为$.ajax(),它们功用邻近,只不过axios遵照promise范例
axios({
url: '.'
}).then((resolve) => {
console.log(resolve)
return '我是第二个then'
}, (reject) => {
console.log(reject)
}).then((resolve_2) => {
console.log(resolve_2) // '我是第二个then'
}, (reject_2) => {
console.log(reject_2)
})
为了防备你对这个链式挪用
看得头昏眼花,我把这个给简化一下
axios({
url: '.'
}).then(胜利回调, 失利回调)
.then(胜利回调2, 失利回调2)
ok,预备好了吗?下面我们先来相识Promise的一些基础概念
2.Promise的基础概念
2.1Promise的作用
Promise是特地用来处理异步编程题目的,避免了层层嵌套的回调函数[Callback Hell]
下面是一个用传统要领Callback Hell来写的异步代码
能够异常明显地看出来,Callback Hell的体式格局让代码的可读性变得异常差
function loadImg(src, callback, fail) {
let img = new Image()
img.onload = function () {
// 胜利回调
callback(img)
}
img.onerror = fail // 失利回调
img.src = src
}
let src = 'https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png'
loadImg(src, function (img) {
console.log(img.width)
}, function () {
console.log('error')
})
2.2 Promise的三个状况
-
pending
初始态,既不胜利也不失利 -
fulfilled
异步操纵胜利 -
rejected
异步操纵失利
Promise对象代表一个异步操纵,且只需异步操纵的效果,能够决议当前是哪种状况
,任何其他操纵都没法转变这个状况,peding可转化为fulfilled与rejected,但fulfilled与rejected不可互相转化
那晓得这三个状况又有什么用咧?
OK,我们看下面的代码
axios({
url: '.'
}).then(胜利回调, 失利回调)
axios({url: '.'})
异步操纵胜利代表了pending
-> fulfilled
-> then里的第一个参数
【胜利回调】
异步操纵失利代表了pending
-> rejected
-> then里的第二个参数
【失利回调】
3.then和catch的链式挪用
因为 Promise.prototype.then
和 Promise.prototype.catch
要领返回promise 对象
所以它们能够被链式挪用。
OK,下面让我们仔细看一下回调触发机制终究如何的历程
axios({
url: '.'
}).then(胜利回调, 失利回调)
.then(胜利回调2, 失利回调2)
是否是看的有点晕?没紧要,下面我来细致解释一下
1.异步操纵胜利
-> 进入第一个then的胜利回调
-> 胜利回调
实行异步操纵胜利 -> 因为又返回了一个Promise实例,其状况因为异步操纵胜利,由pending
转为了fullfiled
,所以还能够再挪用第二个then -> 进入第二个then的胜利回调2
2.异步操纵失利
-> 进入第一个then的失利回调
-> 失利回调
实行异步操纵胜利 -> 因为又返回了一个Promise实例,其状况因为异步操纵胜利,由pending
转为了fullfiled
,所以还能够再挪用第二个then -> 进入第二个then的胜利回调2
你的题目:
1.为何第一个then不管挪用胜利回调
照样失利回调
,第二个then都邑挪用胜利回调2
呢
答:因为第二个then挪用进入哪一个回调函数,完全是看第一个then返回的Promise是什么状况,换言之 —— 看异步操纵胜利与否
举一个栗子
axios({
url: '.'
}).then((resolve) => {
return xxx
// 注重xxx是个未声明的变量
// 浏览器会报错,申明异步操纵失利了
// 所以第一个then返回的Promise的状况是 rejected
}, (reject) => {})
.then((resolve_2) => {
console.log(1)
}, (reject_2) => {
// 所以第二个then只会挪用它的第二个参数
console.log(2)
})
2.你咋不提catch咧?
因为catch就是then的一个语法糖呀
catch等价于then只需第二个参数【失利回调】的情势
上面的例子用catch,能够这么写
axios({
url: '.'
}).then((fulfilled) => {
return xxx
// 注重xxx是个未声明的变量
// 所以第一个then返回的Promise的状况是 rejected
}, (rejected) => {
}).catch((rejected) => {
// 所以直接进入catch
console.log(2)
})
4.本身写一个Promise
第一步
// 声明一个函数 让这个函数返回一个Promise实例
let setPromise = function () {
return new Promise()
}
第二步
// new Promise()接收一个函数
// 划定这个函数必需要有两个参数【胜利回调,失利回调】
let a = 0
let setPromise = function () {
let fn = (x, y) => {
setTimeout(() => {
x('success')
// 一定要写上异步操纵胜利后,会挪用的回调函数
}, 2000)
}
return new Promise(fn)
// 在new的历程中一定有一句fn.call(undefined, fulfilled, rejected)
}
第三步
// 写的更装逼点,顺别把x,y换个名字【实际上是划定】
let setPromise = function () {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success')
}, 2000)
}) // 在new的历程中一定有一句fn.call(undefined, fulfilled, rejected)
}
第四步
// 你要做什么,就用then输入到这个Promise实例内里去
let promiseInstance = setPromise()
promiseInstance.then((success) => {
console.log(success) // 'success'
}, () => {
console.log('失利啦')
})
总结
let setPromise = function () {
return new Promise((resolve, reject) => {
// 你的异步代码
setTimeout(() => {
resolve('success') // 给胜利回调resolve通报一个参数 'success'
console.log('测试一下') // 两秒以后被实行
}, 2000)
})
}
// 你要做什么,就用then输入到这个Promise实例内里去
let promiseInstance = setPromise()
promiseInstance.then((resolve) => {
// 异步操纵实行胜利后实行
console.log(resolve) // 'success'
console.log('圆满运转') // '圆满运转'
}, () => {
console.log('失利啦')
})
5.末了
实在关于Promise和then有一个更具象化的明白
Promise的中文翻译是许诺
,then的中文翻译是然后
所以,你能够设想你去买橘子,效果店里没有进货,伙计对你Promise
,只需他店里到货,then
他就会关照你