上一篇:Promise对象学习
看一个例子:
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回调函数
原文:https://www.cnblogs.com/cathy1024/p/12267891.html