function test1(function test2(){
test3(function test4(){
//....
})
})
const myFirstPromise = new Promise((resolve, reject) => {
resolve(someValue); // resolve
reject("failure reason"); // rejected
}).then(res=>{
}).catch(err =>{
})
new Promise(function(resolve,reject){
resolve('123')
reject('123')
}).then(function(res){
console.log(res)
}).catch(function(err){
console.log(err)
})
上述事例中,在promise里的回调里面执行了resolve(‘123’)后,promise的状态就发生了改变,即不会再往后执行reject(‘123’),原因是在promise状态发生了改变以后就不会在进行改变,即[promiseStatus]为resolve。Promise的状态不可逆。
new Promise(function(resolve,reject){
resolve('123')
}).then('24141234').then(function(res){
console.log(res)
//123
})
上述事例中,在当promise的then是一个字符串(非函数)的时候,它会发生值穿透,即返回的参数123会穿透到接下来的不是非函数的then的回调里面。
new Promise(function(resolve,reject){
console.log('0')
console.log('123')
resolve('789')
console.log('456')
}).then(function(res){
console.log(res)
}).catch(function(err){
console.log(err)
})
/* 打印结果
0
123
456
789
*/
上述事例中,在promise的回调函数中执行是同步的,所以先输入0,后输出123。
而到执行resolve的时候即会执行then,将789作为参数,但是由于then的执行是一个异步操作,所以会产生一定的延时,所以,会先打印出456,在打印出789。
new Promise(function(resolve,reject){
resolve('jacky')
}).then(function(res){
return 'my '+res
}).then(function(res){
console.log(res)
})
/* 打印结果
my jacky
*/
链式调用then,上一个then的返回值,是下一个then接收的参数
new Promise(function(resolve,reject){
resolve('jacky')
}).then(function(res){
return new Error('This is a error')
}).then(function(res){
console.log('then:',res)
}).catch(function(err){
console.log('catch:',err)
})
/* 打印结果
then: Error: This is a error
*/
new Promise(function(resolve,reject){
resolve('jacky')
}).then(function(res){
throw new Error('This is a error')
}).then(function(res){
console.log('then:',res)
}).catch(function(err){
console.log('catch:',err)
})
/* 打印结果
catch: Error: This is a error
*/
上述事例中:
如果用return返回错误,则会返回一个正常的promise,即执行下一个then回调
如果用throw抛出错误,返回一个状态为reject的promise,即执行下一个catch回调
new Promise(function(resolve,reject){
resolve('jacky')
}).then(function(res){
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve('5')
},4000)
})
}).then(function(res){
console.log('then:',res)
}).catch(function(err){
console.log('catch:',err)
})
/* 打印结果 等待5秒后打印
then: 5
*/
上述事例中: 只有返回的promise的状态发生改变了(变为resolve或者reject)才会执行下面的then或者catch,不然就一直等待。