2个函数完成后在JQuery中执行一个函数

2个函数完成后在JQuery中执行一个函数

问题描述:

我一直在努力解决这个问题,并且无法弄清楚如何让一个函数在两个函数结果中继续执行,并在两个函数完成后立即执行。2个函数完成后在JQuery中执行一个函数

我试着这样做:

$.when(SetCountryAndLanguage(), GetUserRoles()).done(SetInlineManualTracking()); 

不过是去SetInlineManualTracking()马上无需等待到2层的功能来完成他们的工作。 如何在两个函数完成后执行第三个函数,同时保持异步优势?

这是函数数1:

//Gets the country the user is in and later set the player language. 
      function SetCountryAndLanguage() { 
       $.get("http://ipinfo.io", function() {}, "jsonp"). 
        done(function(response) { 
         inlineCountry = response.country; 
        }). 
        done(SetInlineManualLanguage); 
      } 

功能编号2:

//Gets the user roles from the db and update the tracking. 
      function GetUserRoles() { 
       debugger; 
       $.ajax({ 
         type: "POST", 
         url: "../Publisher/Service.asmx/SelectUserRoles", 
         contentType: "application/json; charset=utf-8", 
         dataType: "json" 
        }). 
        done(UpdateRoles); 
      } 

而这依赖于其他2个前面的函数第三个功能:

function SetInlineManualTracking() { 
       debugger; 
       //<!-- User tracking data --> 
       window.inlineManualTracking = { 
        uid: inlineUid, // Only this field is mandatory 
        email: Cookies.get('email'), 
        username: inlineUserName, 
        name: Cookies.get('name'), 
        created: new Date().getTime()/1000, 
        updated: new Date().getTime()/1000, 
        group: inlineCountry, 
        roles: userRoles 
       } 
      } 
+1

执行函数而不是传递它们的引用,在每个函数中返回'$ .ajax'的承诺,并将'SetInlineManualTracking'的引用传递给'done()' –

+0

@RoryMcCrossan你能告诉我你的代码是什么意思吗? ? –

+0

我为你添加了一个答案 –

您需要使您执行的功能返回$.get和的承诺。然后,您需要将SetInlineManualTracking的参考提供给done(),而不是立即执行。尝试这个。

$.when(SetCountryAndLanguage(), GetUserRoles()).done(SetInlineManualTracking); 

function SetCountryAndLanguage() { 
    return $.get("http://ipinfo.io", function() {}, "jsonp").done(function(response) { 
     inlineCountry = response.country; 
    }).done(SetInlineManualLanguage); 
} 

function GetUserRoles() { 
    return $.ajax({ 
     type: "POST", 
     url: "../Publisher/Service.asmx/SelectUserRoles", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json" 
    }).done(UpdateRoles); 
} 

注意为SetInlineManualLanguageUpdateRolesSetInlineManualTracking是在请求done处理程序,他们可以在同一时间执行。这不应该是一个问题,除非其中一个依赖于另一个的结果。

+0

现在,它的工作原理,我明白我需要通过AJAX承诺。 –