2016-08-19 15 views
4

我正在開發一個內部頁面,允許用戶上傳包含資源和日期的CSV文件,並讓頁面將這些資源的所有調度信息添加到我們的管理軟件中。這樣做有一個相當不錯的API,我有一個工作模型,但似乎... cludgy。多個AJAX API調用需要前一個調用的響應的最佳實踐?

對於每個資源,我要開始一個新的會話,然後創建一個新的預約,然後添加資源,然後確認預約不堵塞,然後提交預訂。大多數調用都會返回一個變量,我需要爲流程中的下一步操作,所以每個調用都依賴於前一個ajax調用。

目前我通過嵌套AJAX這樣調用與此類似:

$.ajax('startnewsession').then($.ajax('createreservation').then('etcetc')) 

雖然這個作品,我覺得必須有一個更簡單,更「正確」的方式做到這一點,無論是更清晰的代碼和適應性。

+1

我通常將我的數據分割成數組塊。然後,發送第一個塊(索引爲0),並移動到'$ .ajax'的'complete'事件的下一個塊(索引)。在你的場景中,你可能想看看['.when'](https://api.jquery.com/jquery)。當/) –

+0

如果你不得不依靠先前的ajax調用的輸出來進行下一個ajax調用,那麼我認爲$ .when可能沒有幫助。如果你總是有這一系列的ajax調用,那麼我們是否可以將所有邏輯都包含在單個服務中以避免往返? – Developer

回答

0

你正在做什麼是正確的,假設你不能改變你與通信的API。

真的沒有避過不得不做一些嵌套的AJAX的方式,如果您需要前一個的下一個響應數據調用。然而,承諾(.then)使它比做回調更漂亮。

正確的解決方案(如果可能的話)當然會是實現你的API以這樣一種方式,它需要從客戶機到服務器少往返。考慮到在創建預留的談判過程中,在這些步驟之間沒有用戶輸入,您的API應該能夠完成創建預留的整個流程,而無需聯繫客戶端,直到需要用戶提供更多輸入。

記得剛做了一些錯誤的每個的情況下,Ajax調用它們應該失敗之間的處理 - 你不想開始創建跟進API從先前失敗的請求損壞的數據呼叫。

var baseApiUrl = 'https://jsonplaceholder.typicode.com'; 
$.ajax(baseApiUrl + '/posts/1') 
    .then(function(post) { 
    $.ajax(baseApiUrl + '/users/' + post.userId) 
     .then(function(user) { 
     console.log('got name: ' + user.name); 
     }, function(error) { 
     console.log('error when calling /users/', error) 
     }); 
    }, function(error) { 
    console.log('error when calling /posts/', error) 
    }); 
0

簡短的回答:像往常一樣,我試圖做一些連鎖店這樣的:

ajaxCall1.then(
    response => ajaxCall2(response) 
).then(
    response => ajaxCall3(response) 
) 

我試圖避免使用when。像往常一樣我(並打賭你也)有1個Ajax調用(用於表單提交),有時2個鏈接ajax調用,例如,如果我需要獲取表的數據,首先查詢總行數,如果計數大於0,另一個數據請求。在這種情況下,我使用:

function getGridData() { 
     var count; 
     callForRowsCount().then(
     (response) => { 
      count = response; 
      if(count > 0) { 
       return callForData(); 
      } else { 
       return []; 
      } 
     } 
    ).then(response => { 
     pub.fireEvent({ 
      type: 'grid-data', 
      count: count, 
      data: response 
     }) 
     }) 
} 

pub lisher觸發事件,我有我的所有組件進行更新。

在一些真的罕見的情況下,我需要使用when。但這總是糟糕的設計。發生這種情況的時候,當我需要在主要請求之前加載附加數據包,或者當後端不支持批量更新時,我需要發送一堆ajax調用來更新許多數據庫實體。這樣的事情:

var whenArray = []; 
if(require1) { 
    whenArray.push(ajaxCall1); 
} 
if(require2) { 
    whenArray.push(ajaxCall2); 
} 
if(require3) { 
    whenArray.push(ajaxCall3); 
} 
$.when.apply($, whenArray).then(() => loadMyData(arguments));