>

짧은 버전입니다. 일부 데이터를 가져 와서 데이터를 구문 분석 한 다음 배열로 반환하는 ajax 호출을 실행하는 함수가 있습니다. 이 함수를 호출하면 javascript는 ajax 호출이 완료되기 전에 코드를 계속 실행합니다.

여기서는 함수의 구조입니다

function GetList(listName, heads, gibberish){
  var items;
  var siteUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('"+ listName + "')/items";
  $.when(
    $.ajax({
      url: siteUrl,
      method: "GET",
      headers: { Accept: "application/json; odata=verbose" },
      success: function(data) {
        var listItems = data.d.results;
        items = listItems;
      }
    })
  ).done(function() {
    console.log(items);
    items = parseList(items, heads, gibberish);
    return items;

이제 함수 외부에서 $.when 및 ajax 호출을 실행하고 결과를 변수에 할당하면 .done에서 내가 원하는 모든 것을 넣을 수 있으며 원하는대로 작동합니다.

그러나이 함수를 이렇게 호출하면

var heads = ["Title", "Artist", "Plays", "Added", "Genre"];
var gibbe = ["Title", "mz0o", "hd1f", "v9gk", "nphg"];
array = GetList("Music", heads, gibbe);
console.log("Array: ", array);

함수 실행이 끝나기 전에 배열의 콘솔 로그가 정의되지 않은 상태로 반환됩니다. 위 코드의 출력은

배열 : 정의되지 않음
항목 : [[처리되지 않은 데이터]]

따라서 아약스 호출이 완료 될 때까지 함수가 데이터를 반환하지 않더라도 나머지 페이지는 실행됩니다.

그리고 나는 이것을 이렇게 테스트했으며 정상적으로 작동합니다.

 var items;
  var listName = 'Music';
  var siteUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('"+ listName + "')/items";
  $.when(
    $.ajax({
      url: siteUrl,
      method: "GET",
      headers: { Accept: "application/json; odata=verbose" },
      success: function(data) {
        var listItems = data.d.results;
        items = listItems;
      }
    })
  ).done(function() {
    console.log(items);
    var array = parseList(items, heads, gibberish);
    console.log("Array: ", array);

작업 할 수있는 올바른 형식의 데이터를 제공합니다.

그래서 (이전 코드에서) 배열이 더 이상 정의되지 않을 때까지 자바 스크립트를 대기시키는 방법이 있습니까? 나는 그 부분을 $.when에 붙이고 나머지 코드를 .done에 넣으려고했지만 실패했습니다.

자바 스크립트는 내가 잘 아는 언어가 아니다. C #은 저의 장점이므로 소프트 타입의 비동기 언어로 작업하는 것은 어려운 일이었습니다.

편집 : 궁금한 점이 있다면 "parseList"함수는 기본적으로 반환되는 객체를 구문 분석하고 헤더가있는 2d 변수에 넣습니다. "GetList"함수는 공유 점 목록의 데이터를 가져옵니다. 이 프로젝트의 최종 결과는 공유 점 목록에서 원하는 데이터를 가져 와서 이해하기 쉬운 방식으로 사용하는 3 줄 방법입니다.

편집 2 :

다음은 작동하지 않습니다

var heads = ["Title", "Artist", "Plays", "Added", "Genre"];
var gibbe = ["Title", "mz0o", "hd1f", "v9gk", "nphg"];
$.when(
array = GetList("Music", heads, gibbe);
).done(function(){
console.log("Array: ", array);
});

결과가 같으므로 Array를 undefined로 반환 한 다음 예상되는 원시 데이터가있는 항목을 반환합니다. 함수가 데이터를 반환하기 전에 .done을 실행합니다.

편집 3 :
ritaj 당 async : false를 함수에 추가하면 이제 이것을 반환합니다.

항목 : 원시 데이터
배열 : 정의되지 않음

에 들어가서 함수에 로그를 추가 했으므로 이제 함수의 끝은 다음과 같습니다

items = parseList(items, heads, gibberish);
console.log("Pre-return items: ", items);
return items;

이제 나에게 주겠다

항목 : 원시 데이터
사전 반품 항목 : 형식화 된 데이터
배열 : 정의되지 않음

이 시점에서 나는 그것이 내 문제라고 생각한다. 현재 올바른 순서로 코드를 실행하는 것 같지만 어떤 이유로 데이터를 반환하지 않습니다.


  • 답변 # 1

    자바 스크립트에서 비동기 프로그래밍을 다루고있다. 당신이 원하는 것은 일어나지 않을 것입니다. 검색하려면 콜백이 필요합니다 비동기 코드의 결과.

    할 수있는 일은 :

    function GetList(listName, heads, gibberish, onSuccess) {
      var siteUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('"+ listName + "')/items";
      $.ajax({
         url: siteUrl,
         method: "GET",
         headers: { Accept: "application/json; odata=verbose" },
         success: onSuccess
      });
    }
    function _onSuccess(items) {
        // Code here, do what you want with items
    }
    var heads = ["Title", "Artist", "Plays", "Added", "Genre"];
    var gibbe = ["Title", "mz0o", "hd1f", "v9gk", "nphg"];
    GetList("Music", heads, gibbe, _onSuccess);
    
    

관련 자료

  • 이전 c# - NET Jquery 스크립트 오류
  • 다음 html - 반복적으로 사용한 후 죽는 앞으로/뒤로 탐색 링크