苏州网站制作 网站,logo在线设计生成器万动力,南京新标特企业网站哪家广告做的,沧州网络制作公司有哪些Promise是异步编程的一种解决方案#xff0c;它是一个对象#xff0c;可以获取异步操作的消息#xff0c;他的出现大大改善了异步编程的困境#xff0c;避免了地狱回调#xff0c;它比传统的解决方案回调函数和事件更合理和更强大。 所谓Promise#xff0c;简单说就是一个…Promise是异步编程的一种解决方案它是一个对象可以获取异步操作的消息他的出现大大改善了异步编程的困境避免了地狱回调它比传统的解决方案回调函数和事件更合理和更强大。 所谓Promise简单说就是一个容器里面保存着某个未来才会结束的事件通常是一个异步操作的结果。从语法上说Promise 是一个对象从它可以获取异步操作的消息。Promise 提供统一的 API各种异步操作都可以用同样的方法进行处理。 1Promise的实例有三个状态: ●Pending进行中 ●Resolved已完成 ●Rejected已拒绝 当把一件事情交给promise时它的状态就是Pending任务完成了状态就变成了Resolved、没有完成失败了就变成了Rejected。 2Promise的实例有两个过程 ●pending - fulfilled : Resolved已完成 ●pending - rejectedRejected已拒绝 注意一旦从进行状态变成为其他状态就永远不能更改状态了。
Promise的特点 ●对象的状态不受外界影响。promise对象代表一个异步操作有三种状态pending进行中、fulfilled已成功、rejected已失败。只有异步操作的结果可以决定当前是哪一种状态任何其他操作都无法改变这个状态这也是promise这个名字的由来——“承诺” ●一旦状态改变就不会再变任何时候都可以得到这个结果。promise对象的状态改变只有两种可能从pending变为fulfilled从pending变为rejected。这时就称为resolved已定型。如果改变已经发生了你再对promise对象添加回调函数也会立即得到这个结果。这与事件event完全不同事件的特点是如果你错过了它再去监听是得不到结果的。 Promise的缺点 ●无法取消Promise一旦新建它就会立即执行无法中途取消。 ●如果不设置回调函数Promise内部抛出的错误不会反应到外部。 ●当处于pending状态时无法得知目前进展到哪一个阶段刚刚开始还是即将完成。
Promise的基本用法
1创建Promise对象 Promise对象代表一个异步操作有三种状态pending进行中、fulfilled已成功和rejected已失败。 Promise构造函数接受一个函数作为参数该函数的两个参数分别是resolve和reject。
const promise new Promise(function(resolve, reject) {// ... some codeif (/* 异步操作成功 */){resolve(value);} else {reject(error);}
});
一般情况下都会使用new Promise()来创建promise对象但是也可以使用promise.resolve和promise.reject这两个方法 Promise.resolve Promise.resolve(value)的返回值也是一个promise对象可以对返回值进行.then调用代码如下
Promise.resolve(11).then(function(value){console.log(value); // 打印出11
}); Promise.reject Promise.reject 也是new Promise的快捷形式也创建一个promise对象。代码如下
Promise.reject(new Error(“我就是个错误”));
下面是使用resolve方法和reject方法
function testPromise(ready) {return new Promise(function(resolve,reject){if(ready) {resolve(hello world);}else {reject(No thanks);}});
};
// 方法调用
testPromise(true).then(function(msg){console.log(msg);
},function(error){console.log(error);
});
另外Promise有五个常用的方法then()、catch()、all()、race()、finally。
1then() 当Promise执行的内容符合成功条件时调用resolve函数失败就调用reject函数。Promise创建完了那该如何调用呢
promise.then(function(value) {// success
}, function(error) {// failure
});
then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用第二个回调函数是Promise对象的状态变为rejected时调用。其中第二个参数可以省略。 then方法返回的是一个新的Promise实例不是原来那个Promise实例。因此可以采用链式写法即then方法后面再调用另一个then方法。
2. catch() Promise对象除了有then方法还有一个catch方法该方法相当于then方法的第二个参数指向reject的回调函数。不过catch方法还有一个作用就是在执行resolve回调函数时如果出现错误抛出异常不会停止运行而是进入catch方法中。
p.then((data) {console.log(resolved,data);
},(err) {console.log(rejected,err);}
);
p.then((data) {console.log(resolved,data);
}).catch((err) {console.log(rejected,err);
});
3. all() all方法可以完成并行任务 它接收一个数组数组的每一项都是一个promise对象。当数组中所有的promise的状态都达到resolved的时候all方法的状态就会变成resolved如果有一个状态变成了rejected那么all方法的状态就会变成rejected。
let promise1 new Promise((resolve,reject){setTimeout((){resolve(1);},2000)
});
let promise2 new Promise((resolve,reject){setTimeout((){resolve(2);},1000)
});
let promise3 new Promise((resolve,reject){setTimeout((){resolve(3);},3000)
});
Promise.all([promise1,promise2,promise3]).then(res{console.log(res);//结果为[1,2,3]
})
调用all方法时的结果成功的时候是回调函数的参数也是一个数组这个数组按顺序保存着每一个promise对象resolve执行时的值。 4race() race方法和all一样接受的参数是一个每项都是promise的数组但是与all不同的是当最先执行完的事件执行完之后就直接返回该promise对象的值。如果第一个promise对象状态变成resolved那自身的状态变成了resolved反之第一个promise变成rejected那自身状态就会变成rejected。
let promise1 new Promise((resolve,reject){setTimeout((){reject(1);},2000)
});
let promise2 new Promise((resolve,reject){setTimeout((){resolve(2);},1000)
});
let promise3 new Promise((resolve,reject){setTimeout((){resolve(3);},3000)
});
Promise.race([promise1,promise2,promise3]).then(res{console.log(res);//结果2
},rej{console.log(rej)};
)
5. finally() finally方法用于指定不管 Promise 对象最后状态如何都会执行的操作。
promise
.then(result {···})
.catch(error {···})
.finally(() {···}); 最后再来讲讲Promise.all和Promise.race的区别的使用场景
1Promise.allPromise.all可以将多个Promise实例包装成一个新的Promise实例。同时成功和失败的返回值是不同的成功的时候返回的是一个结果数组而失败的时候则返回最先被reject失败状态的值。 Promise.all中传入的是数组返回的也是是数组并且会将进行映射传入的promise对象返回的值是按照顺序在数组中排列的但是注意的是他们执行的顺序并不是按照顺序的除非可迭代对象为空。 需要注意Promise.all获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的这样当遇到发送多个请求并根据请求顺序获取和使用数据的场景就可以使用Promise.all来解决。 2Promise.race 顾名思义Promse.race就是赛跑的意思意思就是说Promise.race([p1, p2, p3])里面哪个结果获得的快就返回那个结果不管结果本身是成功状态还是失败状态。当要做一件事超过多长时间就不做了可以用这个方法来解决
Promise还有一个语法糖的形式可以参考我的另外一篇文章如何理解async/await它和promise有什么区别-CSDN博客