2017-02-03 15 views
1

の配列が、私はpeoplePickersの配列(ユーザーが従業員ディレクトリから人を選ぶことができるコンポーネントを)持っています。私はそれらをループやディレクトリ(非同期、リターンが約束)から情報を取得するための要求の配列を作ります。それから私は、ユーザーIDのオブジェクト(わざとではない配列!)にキーと値として、サーバからの情報として、ピッカー名を追加します。コンソールにログインすると、userIdsは常に空になります。JS約束:リクエスト

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

'getUserInfosFromDirectory()'の中核部分を追加できますか? –

+0

@DanielBそれを追加しました。 btw:私は正しいデータを得て、それが私が望むように返されることを知っています。 – sandrooco

+0

どのようにあなたがこれを「知って」いますか?データが「どこか」から「どこか」に返されるという印象を与えるものは何ですか? –

答えて

0

と呼ばれる機能は、私が適用され、関数のコールバックで戻り値を使用して終了。要求が非同期であったため、結果が利用可能になる前に反復のインデックスが変更されました。

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