promise的常用情况
因为js是单线程的,所以一旦代码中有报错,就不会执行下面的了,如下333就未打印
console.log(111)
throw Error(222)
console.log(333)
好像与promise没关系,哈哈。
1.传说中的 setInterval 与 setTimeout
它们是单独的线程执行计数的(因为 JavaScript 引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确),
它们并不会阻塞js的执行,如下代码先打印的是222
let timer = setTimeout(()=>{
console.log(111);
},1000)
console.log(222);
这时候如果我们想等到111打印后再打印222怎么办(实际项目中并不提倡使用延时器),代码如下
new Promise((resolve,reject)=>{
let timer = setTimeout(()=>{
console.log(111);
resolve();
},1000)
}).then(()=>{
console.log(222);
})
2.异步 http 请求线程
XMLHttpRequest 在连接后是通过浏览器新开一个线程请求,所以它与js也是异步的
所以现在大多数请求的方式,想axios,fetch等其实都已经用promise封装过了(请求成功resolve()失败reject()),比如常遇到的当我获取到请求的数据(走then对应resolve)或请求失败(走catch对应reject)后在进行一系列操作。但是当对多个请求的返回值同时处理的时候就会造成嵌套,这样会使代码显得非常冗长丑陋,难以维护,所以这时候就用到了await,例如:
const init = async ()=>{
let a = await axios().catch(err=>err);
let b = await axios().catch(err=>err);
let c = await axios().catch(err=>err);
return a&&a.num&&b&&b.num&&c&&c.num&&a+b+c
}