promise与async
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可以串行执行异步任务 job1.then(job2).then(job3)。还可以并行执行异步任务,用Promise.all()实现,Promise.all([p1,p2]).then( result => {} )。若只需要先返回的结果,则用Promise.race()即可
ES6提供原生的Promise对象,用来传递异步操作的信息。此对象有两个特点:
- 对象状态不受外界影响,有三种状态(Pending、Resolved、Rejected),仅异步操作的结果可以决定当前属于哪一种状态。
- 一单状态改变,就不会在变。状态改变仅可能从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