併發序列呼叫介面

weixin_33766168發表於2016-10-30

這裡思考比較少,不過因為事情本身比較簡單,就簡單處理了。畢竟我這種菜鳥,高大上的東西是從未停止過仰望的。備註下是因為如果有機會再用到類似的邏輯,可以拿來重新思考一下,另外,我還覺得有點兒TCP裡”滑動視窗“的感覺喔,哈哈哈,畢竟場景類似,控制流量嘛

/** 
 * 程式碼塊說明: 小併發序列呼叫介面處理大批量資料
 * 依賴變數: data (原始資料)
 */
var chunks = [],       // 資料切割儲存
    size = 50,         // 資料分片大小
    concurrence = 4;   // 併發量

    /* 按資料分片大小切割原始資料 */
    while (data.length > 0){
        chunks.push(data.splice(0, size));
    }

    var batchLength = chunks.length; // 切割後資料塊數量
    var steps = 0; // 遊標,用於滑動讀取切割後的資料塊
    /**
     * 核心函式
     * 變數說明: _i (遊標, 用於定位分片資料)
     *         cData (切割後的資料塊陣列) 
     *         len (切割後資料塊數量)
     *         c (傳送請求的併發量)
     */
    var batchPush = function(_i, cData, len, c){
        if (_i < len) {
            var _pulling = true; // 標識位
            var _j = 0; // 臨時變數,定位併發資料塊位置

            //分批請求
            while (_pulling){
                if (cData[_j + _i]){
                    $.ajax({
                        method: 'POST',
                        url: 'xxx',
                        data: JSON.stringify(cData[_j + _i]),
                        dataType: 'json',
                        success: function(rData){
                            // 介面返回碼校驗(此略)
                            ++steps;
                            // 併發都處理完後, 觸發下一次併發(序列)
                            if (steps % c === 0) {
                                // 緩衝一秒
                                setTimeout(function(){
                                    batchPush(steps, cData, len, c);
                                }, 1000);
                            }
                            // 資料處理(此略)
                        },
                        error: function(){
                            // 異常處理(此略)
                        }
                    });
                }
                _j++;
                if (_j >= c){
                    _pulling = false;
                }
            }
        } else {
            // 全部傳送完畢
            steps = 0;
        }
    };
    // 觸發呼叫
    batchPush(steps, chunks, batchLength, concurrence);

Anyway, it works. 有機會讀一讀”滑動視窗”的處理邏輯, 哈哈.

相關文章