JS Promise:请求数组

时间:2017-02-03 13:45:15

标签: javascript asynchronous callback promise jquery-deferred

我有一系列peoplePickers(用户可以从员工目录中选择人员的组件)。我遍历它们并生成一组请求以从目录中获取信息(异步,返回promise)。然后我想将选择器名称作为关键字添加到userIds对象(故意不是数组!),并将服务器中的信息作为值添加。登录控制台时,userIds始终为空。

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

1 个答案:

答案 0 :(得分:0)

我最终在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;
        }
    });
});