在javascript開發過程中,我們不可避免的會遇到一些非同步程式設計的情景,無論是前端的ajax請求還是,node的各種非同步api,下文是在工作學習過程中總結的關於javascript非同步編程集中常見方式用法的總結
javascript非同步程式設計的幾種方法
目前工作中用的比較多的非同步模式程式設計有以下幾種方法
一回呼函數
這是非同步程式設計最基本的方法,假設有兩個函數f1和f2,後者等待前者的執行結果
f1();f2(); 如果f1是一个很耗时的任务,可以考虑改写f1,把f2写成f1的回调函数 function f1(callback){ setTimeout(function(){ // f1的任务代码 //执行回调函数 callback() },1000)}执行代码就变成下面这样:
f1(f2);//呼叫
採用這種方式,我們把同步操作變成了非同步操作,f1不會堵塞程式運行,相當於先執行程式的主要邏輯,將耗時的操作推遲執行
具體例:
由於ajax請求是異步的,有時候我們需要得到ajax請求後的數據,再進行其他的操作,這個時候回呼函數會幫我們解決這個問題,具體代碼如下:
import $ from 'jquery'function getData(callback){ var url="http://xxx.com/activity/v1/homepage/index"; var data={ "cityId":110100, "type":"coupon" } $.ajax({ url:url, type:'get', dataType:'jsonp', jsonp:'callback', data:data, success:function(resp){ if(resp.status==200 && resp.data){ var item = resp.data[0] && resp.data[0].coupon; if(callback){ callback(item) //执行回调函数 } } }, error:function(err){ console.log("error") } }) }function getItem(data){ if(data){ //得到数据进行处理 var url = data.moreUrl; alert(url) } } getData(getItem) //调用二 发布/订阅 模式
我們假定,存在一個"信號中心",某個任務執行完成,就向信號中心"發布"(publish)一個信號,其他任務可以向信號中心"訂閱"(subscribe)這個信號,從而知道什麼時候自己可以開始執行。這就叫做"發布/訂閱模式"(publish-subscribe pattern),又稱為"觀察者模式"(observer pattern)。
這個模式有多種實現,以下採用的是Ben Alman的Tiny Pub/Sub,這是jQuery的一個外掛。
function PubSub(){ this.handlers = {}; } PubSub.prototype = { on:function(eventType,handler){ var self = this; if(!(eventType in self.handlers)){ self.handlers[eventType] = []; } self.handlers[eventType].push(handler); return this; }, trigger:function(eventType){ var self = this; var handlerArgs = Array.prototype.slice.call(arguments,1); for(var i=0;i<self.handlers[eventType].length;i++){ self.handlers[eventType][i].apply(self,handlerArgs) } return self; } }
具體呼叫:
var pubsub=new PubSub();function getData(){ var url="xxx.com/activity/v1/homepage/index"; var data={ "cityId":110100, "type":"coupon" } $.ajax({ url:url, type:'get', dataType:'jsonp', jsonp:'callback', data:data, success:function(resp){ if(resp.status==200 && resp.data){ var item = resp.data[0] && resp.data[0].coupon; pubsub.trigger('done',item) //发布事件 } }, error:function(err){ console.log("error") } }) }//订阅事件pubsub.on('done',function(data){ getItem(data) })function getItem(data){ alert('start') console.log('data='+data) if(data){ //得到数据进行处理 var url = data.moreUrl; alert(url) } } getData() //调用
三Promise物件
Promise 物件是CommonJS工作組提出的一種規範,目的是為非同步程式提供統一介面
結合es7提供的async和await使用,程式碼如下:
import $ from 'jquery'function getData() { return new Promise((resolve,reject) => { var url="http://xxx.com/activity/v1/homepage/index"; var data={ "cityId":110100, "type":"coupon" } $.ajax({ url:url, type:'get', dataType:'jsonp', jsonp:'callback', data:data, success:function(resp){ if(resp.status==200 && resp.data){ var item = resp.data[0] && resp.data[0].coupon; resolve(item) } }, error:function(err){ reject("error") } }) })} function getItem(data){ if(data){ //得到数据进行处理 var url = data.moreUrl; alert(url) }} const testAsync = async () => { var data = await getData(); getItem(data); } //调用testAsync();
以上是Javascript非同步程式設計的方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!