promise以及async/await

promise

js为单线程,js的网络操作,浏览器事件必须异步执行(回调函数实现)promise有各种开源实现,在es6里被统一规范

new Promise(function (resolve, reject) {
    var timeOut = Math.random() * 2;
    setTimeout(function () {
        if (timeOut < 1) {
            resolve('200 OK');
        }
        else {
            reject('timeout in ' + timeOut + ' seconds.');
        }
    }, timeOut * 1000);
}).then(function (r) {
    log('Done: ' + r);
}).catch(function (reason) {
    log('Failed: ' + reason);
});

promise好处是在异步执行的流程中,把执行代码和处理结果代码清晰地分离了
promise
Promise可以串行执行异步任务 job1.then(job2).then(job3)。还可以并行执行异步任务,用Promise.all()实现,Promise.all([p1,p2]).then( result => {} )。若只需要先返回的结果,则用Promise.race()即可

ES6提供原生的Promise对象,用来传递异步操作的信息。此对象有两个特点:

  1. 对象状态不受外界影响,有三种状态(Pending、Resolved、Rejected),仅异步操作的结果可以决定当前属于哪一种状态。
  2. 一单状态改变,就不会在变。状态改变仅可能从Pending-》Resolved或者Pending-》Rejected。

promise异常处理

Promise被明确拒绝时,会发生拒绝,但是若构造函数回调中引发错误,则会隐式拒绝(连try catch都捕捉不到)。
例子

try {
    let p = new Promise((resolve, reject) => {
        throw new Error("I'm error");  // reject(new Error("I'm Error"));
    });
}catch(e) {
    console.log('catch',e);
}

let p = new Promise((resolve, reject) => {
    throw new Error("I'm error"); // reject(new Error("I'm Error"));
});
p.catch(e => {console.log('catch', e)});

async

async函数是Generator函数的语法糖

var asyncReadFile = async function (){
  var f1 = await readFile('/etc/fstab');
  var f2 = await readFile('/etc/shells');
  console.log(f1.toString());
  console.log(f2.toString());
};

优点:内置执行器(async函数执行与普通函数一样,await处返回一个promisr,只执行一行,强制由并行改为串行)、更好的语义、更广泛的适用性(await后面可以跟Promise对象和原始类型的值)

常用用法

async function getStockPriceByName(name) {
  var symbol = await getStockSymbol(name);
  var stockPrice = await getStockPrice(symbol);
  return stockPrice;
}

getStockPriceByName('goog').then(function (result){
  console.log(result);
});

async函数返回一个Promise对象,可以用then添加回调函数,当然Promise运行的结果可能是rejected,所以最好把await命令放在try catch中。当函数执行时,一旦遇到await需等触发的异步操作完成,在执行函数体后面的语句。

deferred对象

deferred为延迟对象,延迟到某个点才开始执行,改变执行结构的方法有两个(resolve、reject),分别对应两种回调(done、fail),always不能成功失败都调用
ajax其实就是deferred对象

$.ajax(url, method).done(res => {}).fail(e => {})

//对个异步请求并行
$.when(ajax1, ajax2).done(resulit => {})

常用API
deferred

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值