1、回调callback()------现在很少使用
2、es6---promise()------使用较多,简单使用时可读性不错且容易理解,但如果情景较复杂时便有局限。
优点:解决回调地狱问题;
缺点:一旦执行不能停止;报错需要回调函数捕捉。
promise扩展:all(),race(),allSettled()
promise.all([arr]).then(((res)=> {
if (res[0].success) { if (res[1].success) { ... } }
}):所有实例都成功才返回成功,有一个失败则结果返回失败。
promise.race([arr]):第一个实例返回成功或者失败,结果就是成功或者失败。
promise.allSettled([arr]):会给出所有实例的执行结果
funtion fun() {
return new Promise((resolve,reject) => {
if (success) {
resolve(data);
} else {
reject(error);
}
})
}
fun.then((data) => {
console.log(data);
});
3、es6---Generator函数
最大的特点是:暂停执行和恢复执行,这是它能封装异步任务的根本原因
yield和awist返回的内容都是new promise(),而且最好写在try...catch...中,给个容错机制,否则如果第一个yield和awist返回的是reject的话,下面的就不会继续执行。
function* gen(x){
var y = yield x + 1;
return y;
}
var g = gen(1);
g.next() // { value: 2, done: false }
g.next(5) // { value: 5, done: true }
--------------------------------------------
function* gen(x){
try {
var y = yield x + 1;
} catch (e){
console.log(e);
}
return y;
}
var g = gen(1);
g.next(); // { value: 2, done: true }
g.throw('出错了'); // 出错了
4、es7---async函数
async 函数的实现,就是将 Generator 函数和自动执行器,包装在一个函数里。
async,awist还有功能将异步转换成同步。
async function fun(args){
// ...
}
// 等同于
function fun(args){
return qiDong(function*() {
// ...
});
}
fun.then(() => {});