2016-06-29 17 views
1

私はjQuery遅延が私のために働くように苦労しています。jQuery遅延の早期解決

AJAX呼び出しが解決される前に、私は以下に記載のパターンを使用してjQueryの .then文と $.ajax呼び出しを行う関数呼び出しの数が、しかし、それぞれの機能が戻っている(そのため、その後の継続連鎖)を一緒にチェーンにしようとしています

function getCurrentYearAbsenceRequestData() { 
var dfd = $.Deferred(); 

    var today = moment(); 
    var startOfCurrentHolidayYear = moment($clnt.holidayYearStartDate, "DD MMMM").format("DD/MM/YYYY"); 
    var startDayOfCurrentHolidayYear = moment().dayOfYear(startOfCurrentHolidayYear) 
    var currentDayOfYear = moment().dayOfYear(); 

    if (moment(today).isBefore(startOfCurrentHolidayYear)) { //checks if holiday year started last year 
     startOfCurrentHolidayYear = moment(startOfCurrentHolidayYear).subtract(1, "years"); //if so subtract 1 year from start of currently holiday year date 
    }; 

    console.log("Start of Holiday year is " + startOfCurrentHolidayYear); 

    var getOrgDataQuery = $apiUrl + "/web/lists/getbytitle('AbsenceRequests')/Items?$select=Id,AssocBranch/Title,DateFrom,DateTo,EmployeeLookup/EmployeeName,EmployeeLookup/Id,AbsenceType/AbsenceTypeShort,ReviewOutcome,TotalDays,AbsenceNotes&$expand=AssocBranch/Title,EmployeeLookup/EmployeeName,AbsenceType/AbsenceTypeShort&$filter=DateFrom ge '" + startOfCurrentHolidayYear + "'"; 

     $.ajax(_cnxRest.getRequest(getOrgDataQuery)) //calls personal library function which formats the parameter - this works OK) 
      .done(function (r) { 
       console.log("Get Org data success" + r); 
       var $absDataCurrentYearData = r.d.results; 
       $absData.allCurrentYear = $absDataCurrentYearData; 

      dfd.resolve(); 
      }) 
     .fail(function (err) { 
      logError(err); 
     }); 
    }; 

    return dfd.promise(); 

}; 

私は、その後の.then機能が進む前に解決するために$アヤックスコールを望む午前、どこへといくつかのインテリジェントなアドバイスを喜んで受け取ることになります。上記と呼ば

// earlier code runs fine to here 
}) 
.then(function (r) { 
    getCurrentYearAbsenceRequestData(); // calls function which contains a $.ajax request 
}) 
.then(function (r) { 
    restructureCurrentYearAbsenceData(); 
}); 

// further processing of results 

機能は、このパターンに従ってください私は間違っている。

答えて

1

非同期関数は、呼び出し元に非同期を通知するために約束を返す必要があります。そうでなければ、発呼者の.then(...).then(...)チェーンは非同期に関係なく続行します。これは質問に記載されている症状です。

コードはいくらか整理されているかもしれませんが、あなたは一部の返品を見逃しています。

// earlier code runs fine to here 
.then(function (r) { 
    return getCurrentYearAbsenceRequestData(); 
// ^^^^^^ 
}) 
.then(function (r) { 
    return restructureCurrentYearAbsenceData(); 
// ^^^^^^ 
}) 
.fail(function (err) { 
    logError(err); // by logging here you will see reported errors arising from the entire chain. 
}); 

function getCurrentYearAbsenceRequestData() { 
    var startOfCurrentHolidayYear = moment($clnt.holidayYearStartDate, "DD MMMM").format("DD/MM/YYYY"); 
    if(moment(moment()).isBefore(startOfCurrentHolidayYear)) { 
     startOfCurrentHolidayYear = moment(startOfCurrentHolidayYear).subtract(1, "years"); 
    }; 
    var getOrgDataQuery = $apiUrl + "/web/lists/getbytitle('AbsenceRequests')/Items?$select=Id,AssocBranch/Title,DateFrom,DateTo,EmployeeLookup/EmployeeName,EmployeeLookup/Id,AbsenceType/AbsenceTypeShort,ReviewOutcome,TotalDays,AbsenceNotes&$expand=AssocBranch/Title,EmployeeLookup/EmployeeName,AbsenceType/AbsenceTypeShort&$filter=DateFrom ge '" + startOfCurrentHolidayYear + "'"; 
    return $.ajax(_cnxRest.getRequest(getOrgDataQuery)) 
// ^^^^^^ 
    .then(function(r) { 
     $absData.allCurrentYear = r.d.results; 
     retrun r; // make the result available to the next step in the caller's .then chain, even if it's not going to be used 
//  ^^^^^^ 
    }); 
}; 

主鎖がに簡素化することができます。ここでは

.then(getCurrentYearAbsenceRequestData) // calls function which contains a $.ajax request 
.then(restructureCurrentYearAbsenceData) 
.fail(function(err) { 
    logError(err); 
}); 

、retrunsは、名前の関数内で書かれたものです。