最近接手了一個小程序項目,其中最大的Js文件在兩千行左右,我根據業務邏輯瀏覽了一遍該js文件,發現很多代碼寫的都有問題,可優化的內容很多。
下面通過該js文件,總結出了幾點,今天先更新一下關於 callback 的使用吧。
callback 都是基於異步方法使用的,優勢:
1,它保證了異步調用流程的正確性,不會出現下一步沒有獲取到上一步的參數內容,導致下一步執行失敗;
2,簡化代碼,讓每一步異步操作都不用考慮後續操作內容,只需要調用對應的callback就可以
涉及到的都是僞代碼,如下:
如B任務要在A任務執行成功之後執行,簡單流程會是:
main:function(){
A();
B();
}
如果 A 和 B 都是同步方法,沒有問題。如果 A 是異步方法(比如wx.request),可能會這樣寫:
main: function(){
A();
}
A:function(){
wx.request({
url:URL,
success:function(){
B();
}
});
}
如果此時 C 任務同樣也要在 A 任務執行成功後執行,此時就要使用 callback了:
main: function(){
A(B);
A(C);
}
A:function(successCallback){
wx.request({
url:URL,
success:function(){
if(successCallback){
successCallback();
}
}
});
}
這樣寫的好處,A方法不需要考慮回調方法的具體內容,只需要專注自己的任務,約定好入參和返回值內容就可以。
上面舉例是一個方法可能有兩種後續操作,其實一個方法只有一個後續操作,也建議使用callback。
比如稍微複雜一點兒的情況:
A 方法需要有參數 name,成功和失敗兩個回調函數,把結果 res 給到回調函數。代碼如下:
A:function(name, successCallback, failCallback){
wx.request({
url: URL,
success:function(res){
if(successCallback){
successCallback(res);
}
},
fail:function(res){
if(failCallback){
failCallback(res);
}
}
});
}
B:function(res){
console.log('成功' + res);
}
C:function(res){
console.log('失敗' + res);
}
此時main方法如下寫:
main:function(){
var name = '';
A(name, B, C);
}
這樣寫 B 和C 方法是否會收到 res 參數,不確定,所以我一般會如下寫:
main: function(){
var name = '';
var successCallback = function(res){
B(res);
}
var failCallback = function(res){
C(res);
}
A(name, successCallback, failCallback);
}
如果覺得把 B 和 C 的邏輯直接寫到 A 方法內部,也無所謂反正,代碼也不多,那麼如果 B和 C 也是異步方法,且也需要有各自的 successCallback和 failCallback呢?是不就複雜了,所以乖乖使用callback吧,會對以後業務邏輯擴展、bug定位、代碼閱讀都有好處。