携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
异步编程
由于JavaScript是单线程的特点,同一时间只能处理一个任务,所以所有任务都需要在队列中等待,前一个任务执行完毕后才能继续执行下一个任务,
开发中遇到的场景
基于异步编程的概念,在现实的开发场景中往往会遇到这样的实现:调用多个接口(异步),等所有接口运行完之后,进行下一步操作。
但由于调用接口时的执行是异步的,执行时间会受到各种因素影响,所有接口全部执行完毕的时间是无法确定的,所以在异步编程下多个任务同时执行如何拿到最佳结果需要用到下面这个方法来实现。
promise.all
传递的参数为一个promise对象列表,Promise.all() 方法接收一个promise的iterable类型的输入(如:Array,Map,Set迭代的类型(ES6))
代码示例:
const promise1 = Promise.resolve(100);
const promise2 = 666;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'fighting');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
在Promise中有三种状态:
- pending(进行中)
- fulfilled(已成功)
- rejected(已失败)
注:如果传入的可迭代对象为空,Promise.all() 会同步返回一个已完成(resolved)状态的 promise。
如果我们在传参的时候传递了不是 promise 类型的值,这些值将被忽略,如果 promise 完成的,返回数组中回包含传递的非 promise 类型数据。
如何取消一个 Promise
Promise.race()
race 有赛跑之意,此方法与promise.all()一样,返回一个 promise,一旦迭代器中的某个 promise 解决或拒绝,返回的 promise 就会解决或拒绝。
使用方法:
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then((value) => {
console.log(value);
});
注:如果传的迭代是空的,则返回的 promise 将永远等待
总结
- 使用 Promise.all 进行并发操作
- promise中all()方法中的参数是一个由多个promise组成的集合
- 参数必须传入的是数组