-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Promise 实战 #52
Comments
有关Promise的几个问题基础概念一:什么是Promise国内比较流行的看法:
Promise 真正的规范,一篇长文。 [Promises/A+](https://promisesaplus.com/)
从问题来看1. 是否可以使用
|
时间 | 宏任务队列 | 微任务队列 |
---|---|---|
1 | console.log('this will first be execd') |
|
2 | setTimeout |
|
3 | resolve('exec true'); //延迟:因为宏任务没有执行完 |
|
4 | console.log('this will be second exec'); |
|
最终执行顺序:
1->2->4(宏任务结束)->3(微任务结束)
async/await 与Promise
一句话总结:await
等的就是一个Promise
。如果等的不是Promise
,那加了await
和不加没区别
- 将常规的回调转变为
Promise
的方法
function util(args,callback){
if(err){
return callback(err);
}else{
return callback();
}
}
//调用
util(args,(err)=>{
if(err){
}else{
}
})
//Promisify
function utilPromise(args){
return new Promise((resolve,reject)=>{
if(err){
reject(err)
}else{
resolve();
}
})
}
//调用
utilPromise.then().catch()
- 将
Promise
转换为async/await
的方法
async init(){
try{
await utilPromise();//resolve状态
}catch(e){
throw new Error(e); //reject状态
}
}
请教一下编程题3中 ,.then(() => { |
编程题一
红灯3秒亮一次,绿灯1秒亮一次,黄灯2秒亮一次;如何使用Promise让三个灯不断交替重复亮灯?(海康威视笔试题)
分析:
先看题目,题目要求红灯亮过后,绿灯才能亮,绿灯亮过后,黄灯才能亮,黄灯亮过后,红灯才能亮……所以怎么通过Promise实现?
换句话说,就是红灯亮起时,承诺2s秒后亮绿灯,绿灯亮起时承诺1s后亮黄灯,黄灯亮起时,承诺3s后亮红灯……这显然是一个Promise链式调用,看到这里你心里或许就有思路了,我们需要将我们的每一个亮灯动作写在then()方法中,同时返回一个新的Promise,并将其状态由pending设置为fulfilled,允许下一盏灯亮起。
编程题二
请实现一个mergePromise函数,把传进去的数组按顺序先后执行,并且把返回的数据先后放到数组data中。
分析:
这道题主要考察用Promise控制异步流程,首先ajax1,ajax2,ajax3都是函数,只是这些函数执行后会返回一个Promise,按照题目要求只要顺序执行这三个函数就好了,然后把结果放到data中;
答案:
编程题三
现有8个图片资源的url,已经存储在数组urls中,且已有一个函数function loading,输入一个url链接,返回一个Promise,该Promise在图片下载完成的时候resolve,下载失败则reject。要求:任何时刻同时下载的链接数量不可以超过3个。
请写一段代码实现这个需求,要求尽可能快速地将所有图片下载完成。
解析
题目的意思是需要先并发请求3张图片,当一张图片加载完成后,又会继续发起一张图片的请求,让并发数保持在3个,直到需要加载的图片都全部发起请求。
用Promise来实现就是,先并发请求3个图片资源,这样可以得到3个Promise,组成一个数组promises,然后不断调用Promise.race来返回最快改变状态的Promise,然后从数组promises中删掉这个Promise对象,再加入一个新的Promise,直到全部的url被取完,最后再使用Promise.all来处理一遍数组promises中没有改变状态的Promise
编程题四
封装一个异步加载图片的方法
解析:
这个不难!
The text was updated successfully, but these errors were encountered: