2015-10-23 79 views
1

在我的方法feedContactCategorySelection,我想等待assignContactCategoryToLocal呼叫完成繼續運行代碼函數調用另一個無需等待完成

feedContactCategorySelection(); 

function feedContactCategorySelection(){ 

    assignContactCategoryToLocal(); 

    var category = sessionStorage.getItem("category"); 

    category = JSON.parse(category); 
    for (var i = 0; category["data"].length; i++) { 
    //.... 
    } 
} 


function assignContactCategoryToLocal() { 

    var category = sessionStorage.getItem("category"); 
    if (category == null) { 
    $.ajax({ 
     url: 'http://localhost:8080/rest/contact/category', 
     type: 'GET', 
     success: function (json) { 
      sessionStorage.setItem("category", JSON.stringify(json)); 
     } 
    }); 
} 
+0

你可以使用'Promise'並在'onFulfilled'處理 – Lucius

+0

@LiYinKong執行代碼的其餘部分 - 如果你不希望你的代碼在IE工作。 – aroth

+0

@aroth從jQuery 1.5開始,由'$ .ajax()'返回的jqXHR對象通過'done'和'fail'實現了Promise接口 – Lucius

回答

1

其餘考慮在這種情況下使用Promise之前。

僞代碼如下:

feedContactCategorySelection(); 

function feedContactCategorySelection(){ 

    assignContactCategoryToLocal().then(function(){ 
    var category = sessionStorage.getItem("category"); 

    category = JSON.parse(category); 
    for (var i = 0; category["data"].length; i++) { 
    .... 
    } 
    }) 

} 

function assignContactCategoryToLocal() { 
    return new Promise(function(resolve, reject){ 
    var category = sessionStorage.getItem("category"); 
    if (category == null) { 
    $.ajax({ 
     url: 'http://localhost:8080/rest/contact/category', 
     type: 'GET', 
     success: function (json) { 
      sessionStorage.setItem("category", JSON.stringify(json)); 
      resolve() 
     } 
     failed:{reject(reason)} 
    }); 
    })  

} 
2

您可以傳遞一個回調函數來assignContactCategoryToLocal()這樣你可以繼續運行,只有當AJAX完成的代碼。事情是這樣的:

feedContactCategorySelection(); 

function feedContactCategorySelection() { 
    // Do anything here before running the ajax 
    // For instance, get category and pass it to the assignContact... 
    var category = sessionStorage.getItem("category"); 
    ... 
    assignContactCategoryToLocal(category, myCallbackFunction); 
} 

function myCallbackFunction(category) { 
    category = JSON.parse(category); 
    for (var i = 0; category["data"].length; i++) { 
     .... 
    } 
} 

function assignContactCategoryToLocal(category, callback) { 

    if (category == null) { 
     $.ajax({ 
      url: 'http://localhost:8080/rest/contact/category', 
      type: 'GET', 
      success: function (json) { 
       sessionStorage.setItem("category", JSON.stringify(json)); 
       // Now that it is done and successful, run the rest... 
       callback(category); 
      } 
     }); 
    } 
} 

了一個例子,你可以得到的類別一次,然後把它傳遞的功能,也許可以幫助理解它們是如何連接。

編輯: 要與該類別是null解決這個問題,這裏是一個修訂版。

feedContactCategorySelection(); 

function feedContactCategorySelection() { 
    // Do anything here before running the ajax 
    // For instance, get category and pass it to the assignContact... 
    var category = sessionStorage.getItem("category"); 
    ... 

    // Move the if statement here so it checks the condition earlier. 
    if (category === null) { 
     assignContactCategoryToLocal(category, myCallbackFunction); 
    } else { 
     myCallbackFunction(category); 
    } 
} 

function myCallbackFunction(category) { 
    category = JSON.parse(category); 
    for (var i = 0; category["data"].length; i++) { 
     .... 
    } 
} 

function assignContactCategoryToLocal(category, callback) { 
    $.ajax({ 
     url: 'http://localhost:8080/rest/contact/category', 
     type: 'GET', 
     success: function (json) { 
      sessionStorage.setItem("category", JSON.stringify(json));       
      // Now that it is done and successful, run the rest... 
      callback(category); 
     } 
    }); 
} 
+0

此代碼存在問題,如果categoryContactCategorySelection中的類爲null,則myCallbackFunction中的var將具有相同的值。 –

+0

呃,不完全是。如果該類別爲'null',則myCallbackFunction永遠不會運行。那是因爲你已經設置了一個if語句,在運行ajax之前檢查類是否爲'null'。在這個例子中'myCallbackFunction'只在類別不是'null'並且ajax成功時纔會運行。試試看,讓我們知道。對於更簡潔的代碼,您可以將'if(category === null)...'移動到'feedContactCategorySelection'。但它應該像上面的代碼一樣工作。 – 1cgonza

+0

如果category爲null,myCallbackFunction運行http://pasteboard.co/1AB6Atxh.png –

1
function feedContactCategorySelection() {  
    // `data` : `sessionStorage.getItem("category")` or response from `$.ajax()` 
    assignContactCategoryToLocal().then(function(data) { 
     // if `category` set , return `category` , else set `category` 
     var category = sessionStorage.getItem("category") != null 
        ? sessionStorage.getItem("category") 
        : sessionStorage.setItem("category", JSON.stringify(data)); 
     category = JSON.parse(category); 
     for (var i = 0; category["data"].length; i++) { 
     //.... 
     } 
    // handle errors, if any, from `$.ajax()` call 
    }, function err(jqxhr, textStatus, errorThrown) { 
     console.log(textStatus, errorThrown) 
    }) 
} 

function assignContactCategoryToLocal() { 
    var category = sessionStorage.getItem("category"); 
    // if `category` is `null` , return `$.ajax()` response 
    return category == null 
     ? $.ajax({ 
      url: 'http://localhost:8080/rest/contact/category', 
      type: 'GET' 
     }) 
     : $.when(category) 
} 
1

請檢查我已經添加async: false,等到獲得Ajax響應。

feedContactCategorySelection(); 

function feedContactCategorySelection(){ 

    assignContactCategoryToLocal(); 

    var category = sessionStorage.getItem("category"); 

    category = JSON.parse(category); 
    for (var i = 0; category["data"].length; i++) { 
    //.... 
    } 
} 


function assignContactCategoryToLocal() { 

    var category = sessionStorage.getItem("category"); 
    if (category == null) { 
    $.ajax({ 
     url: 'http://localhost:8080/rest/contact/category', 
     type: 'GET', 
     async: false, 
     success: function (json) { 
      sessionStorage.setItem("category", JSON.stringify(json)); 
     } 
    }); 
} 
相關問題