小程序 js 異步方法 callback 使用

    最近接手了一個小程序項目,其中最大的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定位、代碼閱讀都有好處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章