promise是什么意思 promise的用法( 三 )


console.log(\\\"line 64:\\\", num);
return 2;
}).then(function (num) {
console.log(\\\"line 67:\\\", num);
return 2;
})
结果:
line 64: 1
line 67: 2

上面的代码使用then方法,依次指定了两个回调函数 。第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数 。当然这里有一个前提,那就是Promise实例的状态为已成功且代码执行过程中不出错的情况下 。万一出错的话,那我们就可以使用then()方法的第二个回调函数或者catch()方法捕获错误 。
Promise.prototype.catch()
catch()方法是.then(null, rejection)或.then(undefined, rejection)的别名,用于指定发生错误时的回调函数 。
function readText(url) {
var p = new Promise(function (resolve, reject) {
$.ajax({
type: \\\"get\\\",
url: url,
success: function (text) {
resolve(text);
},
error:function(err){
reject(err);
}
})
})
return p; // {pending}
}
readText(\\\"../data/1.txt\\\").then(res => {
console.log(\\\"line 93\\\", res)
}).catch(err => {
console.log(err);
})

上面代码中,readText()方法返回一个 Promise 对象,如果该对象状态变为resolved,则会调用then()方法指定的回调函数;如果异步操作抛出错误,状态就会变为rejected,就会调用catch()方法指定的回调函数,处理这个错误 。另外,then()方法指定的回调函数,如果运行中抛出错误,也会被catch()方法捕获 。
then和catch的链式操作
then()和catch()配合使用,实现的链式操作效果更佳 。
var p = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(1);
}, 2000);
})
console.log(\\\"line 21\\\", p);
p.then(function (num) {
console.log(\\\"line 23:\\\", num);
return 2;
}).then(function (num) {
console.log(\\\"line 25:\\\", num);
}).then(function (num) {
console.log(\\\"line 28:\\\", num);
}).catch(function (err) {
console.log(err);
})
结果:
line 21 Promise {}
...等待2s后
line 23: 1
line 25: 2
line 28: 3

上面的代码使用then catch方法进行链式调用,依次指定了三个then()的回调函数以及一个catch()的回调函数 。第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数,同样第二个回调函数完成后,会将返回结果作为参数,传入第三个回调函数,以此类推 。当然这里同样也有一个前提,那就是Promise实例的状态为已成功且代码执行过程中不出错的情况下 。万一出错的话,那catch()方法刚好捕获链式操作过程中出现的错误 。
如果then方法中回调函数的返回值也是一个Promise实例;
function readText(url) {
var p = new Promise(function (resolve, reject) {
$.ajax({
type: \\\"get\\\",
url: url,
success: function (text) {
resolve(text);
},
error: function (err) {
reject(err);
}
})
})
return p; // {pending}
}
// ajax恐怖回调的解决方式1:
// T = T1 + T2 + T3 (时间)
var str = \\\"\\\";
readText(\\\"../data/1.txt\\\").then(txt => {
console.log(\\\"line 36\\\", txt);
str += txt;
return readText(\\\"../data/2.txt\\\");
}).then(txt => {
console.log(\\\"line 40\\\", txt);
str += txt;
return readText(\\\"../data/3.txt\\\");
}).then(txt => {
console.log(\\\"line 44\\\", txt);
str += txt;
return str;
}).then(txt => {
console.log(\\\"line 48\\\", txt);
}).catch(err => {
console.log(\\\"失败:\\\", err);
})
结果:
line 36 11111
line 40 22222
line 44 33333
line 48 111112222233333

上面代码中,第一个then方法指定的回调函数,返回的是另一个Promise对象 。这时,第二个then方法指定的回调函数,就会等待这个新的Promise对象状态发生变化 。如果变为resolved,继续链式调用后面then方法中指定的回调函数,如果状态变为rejected,就会被catch方法捕获 。
注意:Promise 实例的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止 。也就是说,错误总是会被下一个catch语句捕获 。
Promise的静态方法
所谓Promise静态方法,即将封装的方法存储在构造函数Promise上,由构造函数自身调用 。
Promise.all
Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例 。