在 json 循环后推送 2 个数组

Push 2 arrays after json loop

本文关键字:数组 json 循环      更新时间:2023-09-26

我需要运行函数"testfun 2 次",对于每个函数,我将有几个名称,比如 testfun(5, global_user)//输出 [1,2,4,4,5] 和 testfun(7, global_user)//输出 [9,10,11]在运行 2 个函数后,如何将这 2 个数组放在一个数组中?

testfun(5, global_user);
testfun(7, global_user);
function testfun(groupId, myUser) {
    var selectStr = "Title";
    var itemsUrl = "https://info.com(" + groupId + ")/users" + "?" + selectStr + "&" + orderbyStr;
    var executor = new SP.RequestExecutor;
    executor.executeAsync(
        {
         url: itemsUrl,
         method: "GET",
         headers: { "Accept": "application/json; odata=verbose" },
         success: loadTeamNames,
         error: errorHandler
        }
    );
}
var arr = [];
function loadTeamNames(data){
  var jsonObject = JSON.parse(data.body);
  var results = jsonObject.d.results;
  var hide_groups = false;
  $(results).each(function(){
    var name = $(this)[0].Name; 
  });   
}

谢谢

使用 JS

var mergedArray = outputOne.concat(outputTwo);

与 JQuery

var mergedArray = $.merge( $.merge( [], outputOne), outputTwo);

由于testFun()使用异步方法,因此在运行两次后,如果不等待两个 instncs 完成,则无法立即执行任何操作。这是使用承诺完成的

您可以使用$when()并从testFun()返回承诺。需要将loadTeamNames移动到testFun才能做到这一点

在解决两个承诺之前,$.when()不会完成

function testfun(groupId, myUser) {
    var defer = $.Deferred();
    var selectStr = "Title";
    var itemsUrl = "https://info.com(" + groupId + ")/users" + "?" + selectStr + "&" + orderbyStr;
    var executor = new SP.RequestExecutor;
    executor.executeAsync(
            {
                url : itemsUrl,
                method : "GET",
                headers : {"Accept" : "application/json; odata=verbose"},
                success : loadTeamNames,
                error : errorHandler
            }
    );
    function loadTeamNames(data) {
        var jsonObject = JSON.parse(data.body);
        var results = jsonObject.d.results;
        var hide_groups = false;
        $(results).each(function () {
            var name = $(this)[0].Name;
        });
        // resolve deferred and pass data to be used in `$.when()`
        defer.resolve(results);
    }
    return defer.promise;
}

要使用

$.when(testfun(5, global_user),testfun(7, global_user)).done(function (results1, results2) {
    //do what you need to with arrays results1 & results2
});

errorHandler中添加defer.reject()

假设jsonObject.d.results已经是一个数组,你可以做:

arr.concat(results)

这会将您的数组与新结果连接起来。将该代码放在loadTeamNames中,每次运行testfun都会将结果连接到当前数组。但是,不太确定您在loadTeamNames中使用所有这些变量的目的。

function getTeamNames(groupId, myUser) {
    var defer = $.Deferred();
    var selectStr = "$select=Title,LoginName";
    var orderbyStr = "$orderby=Title";
    var itemsUrl = "https://sites.sp.kp.org/pub/qosstgcat/_api/web/SiteGroups/getbyid(" + groupId + ")/users" + "?" + selectStr + "&" + orderbyStr;
    var executor = new SP.RequestExecutor(carootUrl);
    executor.executeAsync(
            {
                url : itemsUrl,
                method : "GET",
                headers : {"Accept" : "application/json; odata=verbose"},
                success : loadTeamNames,
                error : errorHandler
            }
    );
    function loadTeamNames(data) {
        var jsonObject = JSON.parse(data.body);
        var results = jsonObject.d.results;
        var hide_groups = false;
        $(results).each(function(){
         var login_name = $(this)[0].LoginName;
        });
        defer.resolve(results);
    }
    return defer.promise;
}

结果

$.when(getTeamNames(4, global_user),getTeamNames(185, global_user)).done(function () {
        console.log(results);
});