2015-11-30 38 views
0

我有下面的代碼中,我試圖執行httpt要求連續 以下是代碼串行執行

var httpPostData = function (postparameters,postData){ 

    return $http ({   
    method : 'POST', 
    url  : URL, 
    params : postparameters, 
    headers: headers, 
    data : postData 
    }).success (function (responseData){ 
     return responseData.data; 
    }) 
} 

for (var app of appArray){   

    var addAppPromise = httpPostData (restartAppParams,app);   
    addAppPromise.then(function(status){    
     console.log(status.data);    
    }) 
} 

appArray就是我被一個連接一個服務器列表根據參數做一些東西,我通過上面的http post發送(restartAppParams)。

我想此次執行中只有前一個完成和響應已收到下一個HTTP請求應被串行執行,即發生。 任何想法如何做到這一點..

回答

2

您可以使用Array.prototype.reduce來實現這一目標:

.controller('Samplecontroller', function($http, $q) { 

    var restartAppParams = {}; 

    var httpPostData = function(postparameters, postData){ 

    return $http ({   
     method : 'POST', 
     url  : URL, 
     params : postparameters, 
     headers: headers, 
     data : postData 
    }); 

    }; 

    appArray.reduce(function(promise, app) { 
     return promise.finally(function() { 
     return httpPostData(restartAppParams, app) 
      .then(function(response) { 
      console.log(response.data); 
      }); 
     }) 
    }, $q.when()); 

}); 
+1

這種方法還有'appArray.reduce'返回一個你可以鏈接的承諾。您應該將結果推送到數組並返回,而不是'console.log',可能。 –

+0

這真的取決於用戶的需求。我通常在訪問不同的終點時這樣做,因此,每個響應都有不同的後處理。所以我猜測反應數據的積累是**可能**不理想,**可能**。 – ryeballar

1

試試這個:

var httpPostData = function(postparameters, postData, next) { 

    return $http ({   
    method : 'POST', 
    url  : URL, 
    params : postparameters, 
    headers : headers, 
    data : postData 
    }).success (function (responseData) { 
     if (typeof next == 'function') { 
      next(); 
     } 
    }); 
} 

var appArrayCopy = appArray.slice(); 
function fetch() { 
    if (appArrayCopy.length) { 
     var app = appArrayCopy.shift(); 
     httpPostData(restartAppParams, app, fetch); 
    } else { 
     // finished 
    } 
} 
+0

這不正確的行爲,如果任何請求的失敗,而且不會給你一個方法錯誤句柄。你在return之後有一個'typeof'檢查,你沒有對數據做任何事情。 –

+0

此方法不會移動到數組中的下一個元素。 – Nomad

+0

@Nomad'shift'從陣列的前面移除一個元素。 – jcubic

0

angularjs默認使用異步Ajax調用。它實際上是硬編碼的,無法更改(請參閱this commit中的第77行,這是當時master分支的頭部,我正在寫這篇文章)。

另外,請記住,同步調用阻止一切基本上是對JavaScript的是爲內置的無阻塞方法。

如果您的應用程序依賴於請求beeing做了一個又一個,你可以使用他們的承諾和遞歸調用鏈。
像這樣的東西應該工作:

function runXhr(app) { 
    var addAppPromise = httpPostData (restartAppParams,app); 
    addAppPromise.then(function(status){    
    console.log(status.data); 

    // calls the next service if appArray has any services left 
    var app = appArray.shift(); 
    if (app) { 
     runXhr(appArray.shift()); 
    } 
    else { 
     return; 
    } 
    }); 
}