2017-11-05 9 views
0

이것은 달성하려고하는 것입니다.jQuery 지연 및 약속 루프를 사용하여

나는 각각 jQuery에 전달하는 정렬 된 배열을 가지고 있습니다. 각각의 내부에는 원하는 데이터를 가져올 때마다 다른 배열로 푸시 할 아약스 호출이 있습니다 (allJsonData라고 부름). 마지막으로 나는 allJsonData를 표시합니다. 문제는 내가 allJsonData를 표시 할 때마다 요소가 항상 일관성없이 (알파벳순/임의의 순서가 아닌) 표시된다는 것입니다. allJsonData가 사전 순으로 표시되기를 기대하고 있습니다 (AList 데이터를 먼저, BList 데이터를 두 번째로, CList 데이터를 세 번째 등). jQuery를 처음 사용하고 약속했습니다. 미리 감사드립니다.

var sortedArray = [AList, BList, CList, DList]; 

Promise.all(sortedArray.map(function(value) { 
    var url = ...; 
    return getListItems(url); 
})).then(function(results) { 
    // results is an array of results from AList, BList, CList, DList in order 
    let allJsonData = []; 
    results.forEach(function(approvedListItems) { 
     allJsonData.push.apply(allJsonData, approvedListItems.d.results); 
    }); 
    // process allJsonData here 
}); 

// simplify getListItems like this 
getListItems: function(url) {  
    return $.ajax({ 
     url: url, 
     type: "GET", 
     headers: { 
      "accept": "application/json;odata=verbose", 
     } 
    }); 
}, 

여기에 일반적인 생각이다 :

var sortedArray = [AList, BList, CList, DList]; 
var promises = []; 
var allJsonData = []; 
$.each(sortedArray, function (index, value) { 
var dfd = $.Deferred(); 
var url = _spPageContextInfo.webAbsoluteUrl + ('/_api/Web/Lists/GetByTitle(' + "'" + value + "'" + ')/Items? + "SomeFilterParameters"; 

//AJAX CALL HERE// 
.done(
    function (approvedListItems) { 
    if (approvedListItems.d.results.length != 0) { 
     $.each(approvedListItems.d.results, function (i, col) { 
     allJsonData.push(col);//Push into master array 
     }); 
    }//If closed 
    dfd.resolve(allJsonData); 
    } 
);//Done closed 
    promises.push(dfd); 
});//jQuery Each closed 
return $.when.apply($, promises).promise(); 

/**** AJAX의 CALL ****/

getListItems: function(url) {  
    var dfd = $.Deferred(); 
    $.ajax({ 
     url: url, 
     type: "GET", 
     headers: { 
     "accept": "application/json;odata=verbose", 
     }, 
    success: function (data) { 
     dfd.resolve(data); 
    }, 
    error: function (error) { 
     dfd.reject(sender, args, "Error retrieving items"); 
    } 
    }); 
    return dfd.promise();   
}, 
+0

ajax 호출은 async..hence입니다. 세 번째 요청이 완료되고 배열로 푸시되는 동안 첫 번째 호출되는 호출 시간이 길어질 수 있습니다 ... 따라서 배열 순서의 불규칙성 ... –

+0

수 있습니다. done에서 allJsonData를 정렬하십시오. –

+0

실제 Ajax 호출을 보여주십시오. 최선의 답변을 제공하려면 코드의 해당 부분도 확인해야합니다. – jfriend00

답변

0

나는이 같은 간단한을 할 수 있다고 생각 sortedArray의 각 항목에 대해 원시 목록 (내부의 하위 결과는 처리하지 않음)을 얻습니다. Promise.all() 또는 $.when()을 사용하면 원시 목록이 순서대로 표시됩니다. 그런 다음 모든 원시 목록을 얻은 후에 순서대로 처리하고 allJsonData 구조를 순서대로 빌드 할 수 있습니다.

또한 약속 방지 패턴을 getListItems()에서 제거 할 수 있습니다. $.ajax()은 이미 약속을 반환하므로 다른 약속으로 포장 할 필요가 없습니다.

실제로 이것을 원한다면 Promise.all() 대신 $.when()을 사용하도록 변환 할 수 있지만, 인수를 취하고 결과를 반환하기 때문에 $.when()을 사용하는 것이 더 복잡합니다.

또한 url 변수에 Javascript 문자열 구문에 문제가 있습니다. 나는 네가 네가 의도 한 바를 모른다. 그래서 나는 무엇을 제안해야할지 모르겠다. 그러나 너는 그것을 고칠 필요가있다.

+0

감사합니다. ton jfriend00. 예상대로 작동합니다. 지연 및 약속과 관련된 좋은 기사/링크를 통해 나를 안내하면 정말 도움이 될 것입니다. – Sid

+0

@Sid - 여기에서 읽을 수 있습니다 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise. Google을 통해 얻을 수있는 약속에 대한 좋은 기사가 많이 있습니다. 이 질문에 대한 답변이 있으면 대답의 왼쪽에있는 체크 표시를 클릭하여 커뮤니티에 알릴 수 있으며 적절한 절차에 따라 여기에 평판 포인트를 얻을 수 있습니다. – jfriend00