在JavaScript的世界中,所有代码都是单线程执行的,由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。异步执行可以用回调函数实现:比如
function callback() {
console.log('Done');
}
console.log('before setTimeout()');
setTimeout(callback, 1000); // 1秒钟后调用callback函数
console.log('after setTimeout()');
这种订阅以后执行的就是一个promise对象。
什么是promise?
Promise
是一个构造函数,有属于自己私有的all,reject,resolve,rece
等方法,也有原型上面的,属于实例对象调用的方法then,catch。
resolve是成功后的回调函数,reject是异步操作失败后的回调函数,
then
里面的函数就是经常说的回调函数callback,在异步任务执行完后执行,
把回调函数写法分离出来,在异步操作执行完后,用链式调用的方法执行回调函数,对于多层回调来说,非常的方便,可以继续在then
的方法中继续写Promise对象
并返回,继续调用then
来进行回调操作,这就是Promise
的作用。
链式操作:
这样能够按照顺序,每隔两秒输出每个异步回调中的内容:
function runAsync1(){
var p=new Promise(function(resolve,reject){
setTimeout(function(){
console.log('执行完成1')
resolve('icessun1');
},2000);
});
return p; // 返回p实例对象
}
function runAsync2(){
var p=new Promise(function(resolve,reject){
setTimeout(function(){
console.log('执行完成2')
resolve('icessun2');
},2000);
});
return p; // 返回p实例对象
}
function runAsync3(){
var p=new Promise(function(resolve,reject){
setTimeout(function(){
console.log('执行完成3')
resolve('icessun3');
},2000);
});
return p; // 返回p实例对象
}
// 正确的打开Promise的方法
runAsync1()
.then(function(data){
console.log(data);
return runAsync2();
})
.then(function(data){
console.log(data);
return runAsync3();
})
.then(function(data){
console.log(data);
})
pomise的一般写法:
对比以前的多层嵌套回调写法,Promise 的写法更为直观,并且能够在外层捕获异步函数的异常信息,它可以支持多个并发的请求,获取并发请求中的数据。
promise的一些方法:
- Promise.race
类方法,多个 Promise 任务同时执行,返回最先执行结束的 Promise 任务的结果,不管这个 Promise 结果是成功还是失败
- Promise.all
类方法,多个 Promise 任务同时执行。
如果全部成功执行,则以数组的方式返回所有 Promise 任务的执行结果。 如果有一个 Promise 任务 rejected,则只返回 rejected 任务的结果。