Javascript JS承诺:请求数组

Javascript JS承诺:请求数组,javascript,asynchronous,callback,promise,jquery-deferred,Javascript,Asynchronous,Callback,Promise,Jquery Deferred,我有一个PeoplePicker数组(用户可以从employee目录中选择人员的组件)。我对它们进行循环,并生成一个请求数组,以从目录中获取信息(异步,返回承诺)。然后,我想将选择器名称作为键添加到userIds对象(不是故意添加数组!),并将来自服务器的信息作为值添加。登录控制台时,userid始终为空 var userIds = {}; var requests = []; peoplePickers.forEach(function (picker) { var infos =

我有一个PeoplePicker数组(用户可以从employee目录中选择人员的组件)。我对它们进行循环,并生成一个请求数组,以从目录中获取信息(异步,返回承诺)。然后,我想将选择器名称作为键添加到userIds对象(不是故意添加数组!),并将来自服务器的信息作为值添加。登录控制台时,userid始终为空

var userIds = {};
var requests = [];

peoplePickers.forEach(function (picker) {
    var infos = ...;
    requests.push(getUserInfosFromDirectory(infos).then(function (userInfos) {
        userIds[picker] = userInfos.Id;
    }));
});

$.when.apply($, requests).then(function () {
    console.log(userIds);
});
调用的函数

function getUserInfosFromDirectory(loginName){
    ...
    return $.ajax({
        url: ...,
        type: "POST",
        contentType: "application/json;odata=verbose",
        data: loginName,
        headers: {
            "X-RequestDigest": $("#__REQUESTDIGEST").val(),
            "accept": "application/json;odata=verbose"
        }
    }).then(function (data) {
        return data.userInfos
    });
}

最后,我在apply函数的回调中使用了返回值。因为请求是异步的,所以迭代的索引在结果可用之前发生了更改

$.when.apply($, requests).then(function () {
    var userIds = {};
    $.each(arguments, function (i, arg) {
        var val = arg[0];
        if (!val) {
            userIds[peoplePickers[i]] = null;
        } else {
            userIds[peoplePickers[i]] = val.Id;
        }
    });
});

最后,我在apply函数的回调中使用了返回值。因为请求是异步的,所以迭代的索引在结果可用之前发生了更改

$.when.apply($, requests).then(function () {
    var userIds = {};
    $.each(arguments, function (i, arg) {
        var val = arg[0];
        if (!val) {
            userIds[peoplePickers[i]] = null;
        } else {
            userIds[peoplePickers[i]] = val.Id;
        }
    });
});

能否添加
getUserInfosFromDirectory()
的核心主体?@DanielB添加了它。顺便说一句:我知道我得到了正确的数据,并且返回了我想要的数据。你如何“知道”这一点?什么给你的印象是数据从“某地”返回到“其他地方”?@JaromandaX网络面板+断点在
返回数据。userInfos
如果请求是跨源的,网络面板位于:p但你说
数据。userInfos
你在
中返回。那么
是正确的,所以这不是CORS的问题:p是否可以添加
getUserInfosFromDirectory()
的核心主体?@DanielB添加了它。顺便说一句:我知道我得到了正确的数据,并且返回了我想要的数据。你如何“知道”这一点?什么给你的印象是数据从“某地”返回到“其他地方”?@JaromandaX网络面板+断点在
返回数据。userInfos
如果请求是跨源的,网络面板位于:p但你说
数据。userInfos
你在
中返回。那么
是正确的,所以这不是CORS问题:p