编辑代码

// promise的链式调用

const p1 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('ok')
    }, 100)
})

const step1 = new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log('step1...')
        resolve(1)
    }, 0)
})

const step2 = new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log('step2...')
        resolve(2)
    }, 200)
})

const step3 = new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log('step3...')
        resolve(3)
    }, 500)
})

p1
    .then(step1)
    .then(step2)
    .then(step3)
    .then(
        console.log,
        console.error
    );


// 上面代码中,p1后面有四个then,意味依次有四个回调函数。只要前一步的状态变为fulfilled,就会依次执行紧跟在后面的回调函数。

// 最后一个then方法,回调函数是console.log和console.error,用法上有一点重要的区别。console.log只显示step3的返回值,
//console.error可以显示p1、step1、step2、step3之中任意一个发生的错误。举例来说,如果step1的状态变为rejected,
// 那么step2和step3都不会执行了(因为它们是resolved的回调函数)。Promise 开始寻找,接下来第一个为rejected的回调函数,
// 在上面代码中是console.error。这就是说,Promise 对象的报错具有传递性。