当前位置: 首页 > 后端技术 > Node.js

Javascript异步编程-基础

时间:2023-04-03 15:43:34 Node.js

在前端领域,ajax请求非常普遍。相信每个前端er都写过如下代码://前提是引入jquery$.ajax({type:'get',url:'/path/to/data',success:function(response){},error:function(errMsg){}})上面代码中的成功和错误称为回调函数。基于js异步IO的特点,代码的意思是ajax请求成功后执行success函数,ajax请求失败时执行error函数。但是在某些情况下,业务逻辑可能需要我们在成功状态下生成多个回调函数,或者同时发送多个ajax请求,在所有成功状态后执行回调。这种方法似乎有点牵强。1.单个ajax请求有多个回调响应//使用上面的方法,有两个业务逻辑如下$.ajax({type:'get',url:'/path/to/data',success:function(response){//todosuccessCallback2(response);successCallback3(response);}})如果继续使用上面的写法,回调会嵌套。如果需要在successCallback2完成后继续回调,需要逐层嵌套set。代码不是纵向开发的,而是横向开发的,这就是js中的回调地狱。2.多个ajax请求希望有一个共同的回调响应//继续使用原来的方法,假设有多个ajax请求,希望全部完成后执行回调函数。functionfetchData(url,successCb,errorCb){returnfunction(){$.ajax({type:'get',url:url,success:successCb,error:errorCb});}}}functionsuccessCb(){console.log('success');}functionerrorCb(){console.log('error');}varfetchData1=fetchData('/path/to/data1',successCb,errorCb);varfetchData2=fetchData('/path/to/data2',successCb,errorCb);如果同一个fetch数据有两个操作,如果我们想并行操作,只能重写fetchData1varfetchData1=fetchData('/path/to/data1',fetchData2,errorCb);fetchData1();这种写法实际上是在fetchData1成功后进行fetchData2操作,严格来说并不是并行操作。然后,在fetchData2成功状态的回调中,我们可以得到这两个ajax请求的返回值。这样的代码并不完美。大家在追求webpack+es6+babel的技术栈的时候,也应该思考如何从最基础的代码出发,提高生产力和代码的可维护性。发现业务中代码的痛点后,就需要想办法解决。好在前端百花齐放,针对此类问题已经有很多成熟的解决方案。接下来的几篇文章会详细讲解这些异步方案的实现方法和代码原理,每个方法都实现了一个tiny版本。所有文章代码都在github上开源。如果你有任何问题、建议甚至错误,你可以在github中提交问题给我。欢迎大家热烈讨论。从下一篇文章开始,我们将从Deferred对象着重解决以上两个问题。有兴趣的同学继续往下看。Javascript异步编程-延迟对象