使用延期获取列表项

时间:2018-11-09 08:35:36

标签: jquery ajax rest sharepoint

我正在处理此代码。我需要在顶部添加另一个ajax以获得基于第一个循环的列表项。除非写警报(“ WAIT WAIT”),否则结果不正确。

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;
}

我搜索了这个问题,发现这些功能不同步。调用wait或sleep函数无法正常工作,因为没有确切的查询时间估算。我应该使用$ .Deferred,但是我不知道如何在我的loadRestRequest函数中使用它。 我的代码在sharepoint 2013上运行

2 个答案:

答案 0 :(得分:0)

要查询 async 请求列表,可以使用jQuery.when()

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

official documentation避免使用async = false

  

从jQuery 1.8开始,对jqXHR($ .Deferred)使用async:false是   不推荐使用您必须使用成功/错误/完成回调选项   代替

示例

该示例演示如何链接异步调用(主查询和子查询列表):

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);
});

答案 1 :(得分:-1)

我了解异步ajax回调。 link可以帮助我理解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;
}