JavaScript之Promise

390 阅读2分钟

1. 回调函数

回调函数是指一个作为参数传递给另一个函数的函数,它在传给的函数内部执行,而执行此操作的函数是高阶函数

回调的作用:

javascript在浏览器中的运行是单线程事件,为了防止阻塞长时间运行的操作,使用回调,比如某些函数需要将请求发送到服务器并等待响应。

回调就是一种方法,帮我们确保某些代码直到另一些代码已经执行完毕后才执行。

function dowork(subject, callback){ 
    alert(subject);
    callback(); 
}
function Finished(){
  alert('Finished');
}
dowork('math',Finished);

当多个异步函数一个接一个嵌套执行时,会产生回调地狱。避免回调地狱:promise,async-await。

2. Promise

promise主要解决两个问题:

  • 回调地狱,代码难以维护
  • 支持多个并发请求,解决异步问题

es6 用法

promise是一个构造函数,接受一个函数作为参数,这个函数需要传入两个参数:

  • resolve:异步操作执行成功的回调函数
  • reject:异步操作执行失败的回调函数
let p = new Promise((resolve, reject) => {
    //做一些异步操作
    setTimeout(() => {
        console.log('完成');
        resolve('成功');
    }, 2000);
})

then

then方法接受两个参数,第一个是resolve的回调,第二个是reject的回调,可以分别拿到他们传过来的数据。

let p = new Promise((resolve, reject) => {
    //做一些异步操作
  setTimeout(function(){
        var num = Math.ceil(Math.random()*10); //生成1-10的随机数
        if(num<=5){
            resolve(num);
        }
        else{
            reject('数字太大了');
        }
  }, 2000);
});
p.then((data) => {
        console.log('resolved',data);
},(err) => {
        console.log('rejected',err);
}
); 

catch

用来指定reject的回调,效果和then的第二个参数一样,并且如果执行resolve的回调抛出异常,不会报错卡死,而是进入到catch方法中。

p.then((data) => {
    console.log('resolved',data);
}).catch((err) => {
    console.log('rejected',err);
});

all

接受一个数组参数,并行执行异步操作,在所有异步操作执行完成后才执行回调。

let Promise1 = new Promise(function(resolve, reject){})
let Promise2 = new Promise(function(resolve, reject){})
let Promise3 = new Promise(function(resolve, reject){})
let p = Promise.all([Promise1, Promise2, Promise3])
p.then(funciton(){
  // 三个都成功执行
}, function(){
  // 只要有一个失败
})

race

接受两个函数,哪个最先执行完毕,就以哪个为准执行回调

Promise.race([requestImg(), timeout()])
.then((data) =>{
    console.log(data);
}).catch((err) => {
    console.log(err);
});