从应用角度细说Promise(一)
Promise对象传入一个函数作为参数,这个函数可以是任意函数,也可以是匿名函数。调用Promise对象就会执行这个函数。
例:
const MyPromise = new Promise(() => {
console.log('start')
})
MyPromise
代码会输出一个start
Promise还提供了一个then
方法,能分步执行代码,then
方法接受一个函数作为参数,这个函数甚至可以只是一条函数语句,举个例子:
const MyPromise = new Promise(() => {
console.log('start')
})
MyPromise.then(console.log(1)).then(console.log(2))
这段代码会依次输出三行内容,分别是start,1,2
,即先执行Promise里边的内容,再依次执行每一个then
。
如果只是这样,那Promise的功能未免太简单了。Promise对象传入的函数也是可以有参数的,最多有两个,第三个参数会失效,调用就会报错。函数的参数与一般意义上的参数不同,这个参数可以理解为一个已经定义好的函数,接受任意一个值,并把该值传入then方法中,因此then方法中的函数也可以有参数,但是值只会传给第一个参数,并不会传给第二个参数。
举个例子:
const funa = new Promise((a, b) => {
a('a')
})
funa.then((val1, val2) => console.log(val1))
这段代码会输出一个字符串 a
如果将then中的输出改为val2
,像这样:
const funa = new Promise((a, b) => {
a('a')
})
funa.then((val1, val2) => console.log(val2))
那么这段代码会输出一个undefined
注意:
这里一些人可能会好奇如果Promise中的a
传入多个值,能不能输出val2
呢,像这样:
const funa = new Promise((a, b) => {
a('a','b')
})
funa.then((val1, val2) => console.log(val2))
结果还是输出undefined
,并且val1
的值依然是字符串a
,也就是说第二个值没有起到任何作用。
Promise传入函数的第二个参数使用方法和第一个参数一样,只是第一个参数是Promise状态为resolve
时候的输出,第二个参数是Promise为reject
时候的输出。(关于Promise的状态等概念知识参考其他博客)
如果调用第二个参数,会出现一段红字,注意这个代码报错了,是告诉你Promise状态被拒绝了,条件是可以自己设置的,这一点类似于error方法,可以自定义的。举个例子:
const funa = new Promise((a, b) => {
b('a')
})
funa
输出:
(node:30360) UnhandledPromiseRejectionWarning: a
Promise里b
函数传入什么值,在冒号后边就显示什么值。
在嵌套使用多个then
方法的时候,前一个then
的输出会作为后一个then的输入,这里就体现了Promise对象的一个核心,Promise链。
举个例子:
const funa = new Promise((a, b) => {
a('a')
})
funa.then(val => {return val+'1'}).then(val => console.log(val))
这段代码最终输出 a1