2015-10-23 76 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)); 
     } 
    }); 
} 
相关问题