Используйте deferred для получения элементов списка - PullRequest
0 голосов
/ 09 ноября 2018

Я имею дело с этим кодом.Мне нужно добавить еще один Ajax, чтобы получить список элементов базы на первом цикле.Результат неверен, если не записано предупреждение («ПОДОЖДИТЕ ПОДОЖДИТЕ»).

loadRestRequest("/_api/Web/lists/GetByTitle('KSF')/items?$filter=Master eq 94 " ,
    function (data) {
            $.each(data.d.results, function (idx, val) {
                ksfId = val.ID;
                //do some stuff
                loadRestRequest("/_api/Web/lists/GetByTitle('KPI')/items?$filter=KSF eq " + ksfId,
                    function (data) {
                        //do some stuff
                    });
                alert("WAIT WAIT");
            });

    });

Я дважды вызываю функцию ниже, чтобы получить элементы списка

function loadRestRequest(url, callback) {
    var async = true;
    var res = null;
      if(callback == null)
    {
    async = false;
    callback = function (data) {
        res = data.d;
    }
      }
    $.ajax
    url: url,
        typ({
            e: "GET",
            async: async,
            headers: {
                "accept": "application/json;odata=verbose",
            },
            success: callback,
            error: function (error) {
                alert(JSON.stringify(error));
            }
        });
   return res;
}

Я погуглил эту проблему и обнаружил, что эти функции не синхронизированы.Вызов функции ожидания или ожидания работает неправильно, поскольку нет точной оценки времени запроса.Я должен работать с $ .Deferred, но я не знаю, как использовать его в моей функции loadRestRequest.мой код работает на sharepoint 2013

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Я узнаю об асинхронном обратном вызове ajax. Эта ссылка помогает мне понять разницу между done () и then (). Приведенный ниже код решил мою проблему, все обратные вызовы действий выполняются в функции успеха ajax, после чего в done () выполняются некоторые действия, которые необходимо выполнить после обратного вызова.

  loadRestRequest("/_api/Web/lists/GetByTitle('KSF')/items?$filter=Master eq 94 ").done(function (data) {
             $.each(data.d.results, function (idx, val) 
             //do some stuff after first callback  
             ksfId = val.ID;
             loadRestRequest1("/_api/Web/lists/GetByTitle('KPI')/items?$filter=KSF eq " + ksfId).done(function (data){
                             //do some stuff after second callback
                        })       
                    });
            });

также две разделенные функции используются в верхней части кода.

function loadRestRequest(url) {
    var dfd = $.Deferred();
    $.ajax
    url: url,
        typ({
            e: "GET",
            async: true,
            headers: {
                "accept": "application/json;odata=verbose",
            },
            success: function (data) {
                 //do some stuff that you need result
                dfd.resolve(data);
            },
            error: function (error) {
                alert(JSON.stringify(error));
                dfd.reject(error);
            }
        });
   return dfd;
}


function loadRestRequest1(url) {
    var dfd = $.Deferred();
    $.ajax
    url: url,
        typ({
            e: "GET",
            async: true,
            headers: {
                "accept": "application/json;odata=verbose",
            },
            success: function (data) {
                //do some another stuff that you need result
                dfd.resolve(data);
            },
            error: function (error) {
                alert(JSON.stringify(error));
                dfd.reject(error);
            }
        });
    return dfd;
}
0 голосов
/ 11 ноября 2018

Для запроса списка асинхронных запросов вы можете использовать jQuery.when()

var promises = $.map(array, function(item) {
    return $.ajax({
        url: url,
        method: "GET",
        headers: { "Accept": "application/json; odata=verbose" },
   });
});
return $.when.apply($, promises); 

Избегайте async = false За официальной документации :

Начиная с jQuery 1.8, использование async: false с jqXHR ($ .Deferred) осуждается; Вы должны использовать параметры обратного вызова «успех / ошибка / полный» вместо

Пример

В примере показано, как связывать асинхронные вызовы (основной запрос и список подзапросов):

function getRequest(url){
   return $.ajax({
     url: url,
     method: "GET",
     headers: { "Accept": "application/json; odata=verbose" },
   });
}



var mainQueryResult = null;
var subQueriesResult = null;
var requestUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('Site Pages')/items";
getRequest(requestUrl)
.then(function(data){
   mainQueryResult = data.d.results;
   var promises = $.map(data.d.results, function(item) {
         var subRequestUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('Site Pages')/items(" + item.Id + ")";   
         return getRequest(subRequestUrl);
   });
   return $.when.apply($, promises); 
})
.then(function(){
    subQueriesResult = $.map(arguments, function (args,idx) {
        return args[0].d; 
    })

    //print results
    console.log(mainQueryResult);
    console.log(subQueriesResult);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...