js异步编程解决方案

这里所说的异步解决方案,主要针对了多个异步操作,并且异步操作之间相互依赖,这里总结一下解决方案。

1、回调函数

这是最古老的方法,尽管能解决异步相互依赖的情况,但是当异步操作过多,多层嵌套的回调函数会让代码可读性非常差,也不够优雅,另外也没有比较好的错误处理机制,例如:

$.get(path1,function(data1){
	$.get(path2,function(data2){
		$.get(path3,function(data3){
			console.log('done');
		});
	});
});

接下来是es6之后提出的一些解决方案:

2、promise

简单来说是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

promise对象有两个特点:

①对象的状态不受外界影响,有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败),只有异步操作的结果,才能决定当前是哪种状态

②一旦状态发生改变,就不会再产生变化(pending-fulfilled,pending-rejected),这时候就称为resolved,如果改变已经发生,再给promise对象添加回调函数,也能得到结果,这与回调函数不同,回调函数的事情一旦错过,再去监听,是不会得到结果的

举个例子:

const p = new Promise((resolve,reject) => {
	$.get(path1,data1 => {
		resolve(data1);
	});
});
p.then(value => {
	console.log(value);//data1
});

上述promise对象新建后就会立刻执行,之后可以选择任何时候添加回调。

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

扫描二维码关注公众号,回复: 2437850 查看本文章

Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

3、generator

4、async函数

猜你喜欢

转载自blog.csdn.net/ppx2017/article/details/80980363