微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Promise学习笔记2

上一篇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回调函数

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐