首页 > 其他 > 详细

Promise学习笔记(2)

时间:2020-02-06 11:42:36      阅读:70      评论:0      收藏:0      [点我收藏+]

上一篇:Promise对象学习

 

Promise.prototype.catch()

看一个例子:

var promise = new Promise(function(resolve, reject) {
    resolve(‘ok‘)
    setTimeout(function(){
        throw new Error(‘test‘)
    })
})

promise.then(function(value){
    console.log(value);
})

这段代码执行结果如下:

技术分享图片

 

 

 上面代码中,Promise指定在下一轮“事件循环”再抛出错误。到了那个时候,Promise的运行已经结束,所以这个错误是在Promise函数体外抛出的,会冒泡到最外层,成了未捕获的错误。

 

这个例子跟上一篇中一个例子很像,再贴一下代码:

var promise = new Promise(function(resolve, reject) {
    resolve(‘ok‘)
    throw new Error(‘test‘)
})

promise.then(function(value){
    console.log(value);
}).catch(function(error){
    console.log(error);
})

执行结果如下:

技术分享图片

 

 

 并不会抛出错误。因为Promise状态已经变成Resolved,再抛出错误是无效的。

 

 

再看一个例子

var someAsyncThing = function () {
    return new Promise(function(resolve, reject){
        // 下面一行会报错,因为x没有声明
        resolve(x + 2);
    })
}

someAsyncThing().catch(function(error){
    console.log(‘oh no‘, error)
}).then(function(){
    console.log(‘carry on‘)
})

运行结果:

技术分享图片

 

 

 

catch方法返回的还是一个Promise对象,因此后面还可以接着调用then方法

上面的代码运行完catch方法指定的回调函数后会接着运行后面那个then方法指定的回调函数。如果没有报错则跳过catch方法。

Promise.resolve().catch(function(error){
    console.log(‘oh no‘, error)
}).then(function(){
    console.log(‘carry on‘)
})

执行结果:

carry on

上面的代码因为没有报错而跳过catch方法,直接执行了后面的then方法。此时要是then方法里面报错,就与前面的catch无关了

 

 

catch方法中还能再抛出错误

var someAsyncThing = function(){
    return new Promise(function(resolve, reject){
        // 下面一行会报错,因为x没有声明
        resolve(x + 2)
    })
}

someAsyncThing().then(function(){
    console.log(‘first then‘)
}).catch(function(error){
    console.log(‘oh no‘, error)
    // 下面一行会报错,因为y没有声明
    y + 2
}).then(function(){
    console.log(‘carry on‘)
})

执行结果如下:

技术分享图片

 

 

 

上面的代码中,catch方法抛出一个错误,因为后面没有别的catch方法,导致这个错误不会被捕获,也不会传递到外层。

改写一下代码:

var someAsyncThing = function(){
    return new Promise(function(resolve, reject){
        // 下面一行会报错,因为x没有声明
        resolve(x + 2)
    })
}

someAsyncThing().then(function(){
    console.log(‘first then‘)
}).catch(function(error){
    console.log(‘oh no‘, error)
    // 下面一行会报错,因为y没有声明
    y + 2
}).then(function(){
    console.log(‘carry on‘)
}).catch(function(error){
    console.log(‘oh no‘, error)
})

执行结果如下:

技术分享图片

 

 

 上面代码中,第二个catch方法用来捕获前一个catch方法抛出的错误。

 

 

Promise.all()

Promise.all方法用于将多个Promise实例包装成一个新的Promise实例

var p = Promise.all([p1, p2, p3])

看一个经典实用的例子

var promises = [2, 3, 5, 7, 11, 13].map(function(id){
    return getJSON(‘/post‘ + id + ‘.json‘);
})

Promise.all(promises).then(function(posts){
    // ...
}).catch(function(reason) {
    // ...
})

上面代码中,promises是包含6个Promise实例的数组,只有这6个实例的状态都变成fulfilled,或者其中一个变为rejected,才会调用Promise.all方法后面的回调函数。

 

下面是另一个例子

1 const databasePromise = connectDatabase()
2 
3 const booksPromise = databasePromise.then(findAllBooks)
4 
5 const userPromise = databasePromise.then(getCurrentUser)
6 
7 Promise.all([booksPromise, userPromise]).then(([books, user]) => {
8     pickTopRecommentations(books, user)
9 })

上面的代码中,booksPromise和userPromise是两个异步操作,只有他们的结果都返回,才会触发pickTopRecommentations回调函数

 

Promise学习笔记(2)

原文:https://www.cnblogs.com/cathy1024/p/12267891.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!