Promise的几个代码片段

片段1

<script>
        var p1 = new Promise(function(resolve, reject) {
            resolve(1)
        })

        var p2 = Promise.reject(2)

        // 异步1
        p2.then(function(value) {
            console.log('doo1')
        }, reason => {
            setTimeout(function() {
                 console.log('doo111111111111111') // [最后]
            }, 2000)

            console.log('doo11') // [1]

        }).then(value => {
            console.log('doo1111') // [4]
        }, value => {
            console.log('doo111')
        }).then(value => {
            console.log('doo11111') // [6]
        }, value => {
            console.log('doo111111')
        })

        // 异步2
        p2.catch(function(reason) {
            console.log('catch()' + reason) // [2]
            // return Promise.reject()
        }).then(value => {
            console.log('doo0') // [5]
        }, value => {
            console.log('doo00')
        })


        // 异步3
        p2.then(function(value) {
            console.log('doo2')
        }, reason => {
            console.log('doo22') // [3]
        })


        // Promise.all([p1, p2]).then(function(value) {
        //     console.log('onResolved()' + value)
        // }, function(reason) {
        //     console.log('onRejected()' + reason)
        // })
    </script>

异步1 异步2 异步3这个3组链式调用,是并行调用的,彼此之间不关联。

片段2

 <script>
        var p1 = new Promise(function(resolve, reject) {
            resolve('Rick')
        })

        setTimeout(() => {
            p1.then(value => {
                console.log('hello: ' + value) // 后指定回调函数
            })
        }, 1000)
    </script>

可以在resolve之后,再声明then

片段3

 <script>
        console.log('-----------')

        var p = Promise.reject(100)

        p.then(value => {}, reason => {
            console.log('---onRejected: ' + reason)
        }).catch(error => {
            console.log('---catch: ' + error) // 被then中的onRejected处理,catch就不会再执行
        })

        p.then(value => {}).catch(error => {
            console.log('---22222222catch: ' + error) // catch会再执行
        })

    </script>

如果在then中的oneRejected中处理了,就不会在catch中处理了。处理后,不抛出异常或rejected,下一个then将会执行onResolved