ES6-异步编程

1、Promise

Promise是异步编程的一种解决方案。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。

Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。除了异步操作的结果,任何其他操作都无法改变这个状态。

Promise 对象只有:从 pending 变为 fulfilled 和从 pending 变为 rejected 的状态改变。只要处于 fulfilled 和 rejected ,状态就不会再变了即 resolved(已定型 )。

Promise是一个构造函数,其原型上有then、catch、finally方法,对象上有reject、resolve方法。

  • resolve:异步操作执行 "成功" 后的回调函数
  • reject:异步操作执行 "失败" 后的回调函数
  • then:当上面的resolve函数时回调
  • catch:当上面执行reject函数时回调
  • finally:finally在最后总会执行
function getName() {
    let p = new Promise(function(resolve, reject) {
        setTimeout(function() {
            let x = Math.random();
            if (x >= 0.5) {
                //转为成功状态
                resolve("成功了");
            } else {
                //转为失败状态
                reject("失败了");
            }
        }, 1000);
    })
    return p;
}

function test() {
    let p = getName();
    p.then(function(data) { //监听成功状态
        console.log("成功", data);
    }).catch(function(e) { //监听失败状态
        console.log("失败", e);
    }).finally(function() {
        console.log("end...");
    });
}
test();

pormise链式操作用法:

从表面上看,Promise只是能够简化层层回调的写法,而实质上,Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用,它比传递callback函数要简单、灵活的多。所以使用Promise的正确场景是这样的:

function tool(arg) {
    let p = new Promise(function(resolve, reject) {
        resolve(arg + 10)
    });
    return p;
}

tool(10).then((data) => {
    console.log(data);    //20
    return tool(data);
}).then((data) => {
    console.log(data);    //30
    return tool(data);
}).then((data) => {
    console.log(data);    //40
})

then方法的返回值:如果then方法调用时传入的函数的返回值是一个Promise对象,它的返回值就是这个Promise对象, 如果then方法调用时传入的函数的返回值不是一个Promise对象,它的返回值就是一个新的Promise对象并且包装了,then方法调用时传入的函数的返回值 。

2、Async和await

Promise的链式操作其实已经实现的很好了,但是为了体现编程的最高思想,高内聚低耦合,解决异步代码的嵌套问题,我们可以用到async方法和await方法。

函数使用async修饰,该函数中可以使用await修改一个函数调用语法,被调用的函数可以 是一个Promise的值。

async 函数中可能会有 await 表达式,async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值

function tool(arg) {
    let p = new Promise(function(resolve, reject) {
        resolve(arg + 10)
    });
    return p;
}

async function test() {
    let re = await tool(10);    
    console.log(re);            //20
    let re2 = await tool(re);    
    console.log(re2);           //30
    let re3 = await tool(re2);
    console.log(re3);           //40
}
test();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值