Вы можете дождаться завершения всех обещаний, используя $ .when.apply, как вы упоминали.Вот синтаксис:
var promises = [];
promises.push(loadSomeData());
promises.push(loadMoreData());
$.when.apply($, promises)
.fail(function(err) {
console.log(err);
})
.done(function (result1, result2) {
console.log(result1);
console.log(result2);
});
Обратите внимание, что в вызове done есть 2 аргумента, которые соответствуют числу обещаний, добавленных в массив.Первое обещание - это первый аргумент, второе обещание - это второй аргумент и т. Д.
Вот еще один способ получить пользователя с помощью JSOM:
function getUser(email) {
var context = SP.ClientContext.get_current();
var user = context.get_site().get_rootWeb().ensureUser(email);
context.load(user);
context.executeQueryAsync(function (sender, args) {
console.log("Success: " + user.get_id());
}, function (sender, args) {
console.error(args.get_message());
});
}
SP.SOD.executeOrDelayUntilScriptLoaded(function () {
getUser("my@email.com");
}, "SP.js")
Кроме того, если вы хотителучший способ справиться со всеми этими обещаниями, взгляните на jQuery Deferred .Вы можете создавать свои собственные обещания и разрешать их после завершения вызовов.
function getUserAsPromise(email) {
var deferred = $.Deferred();
var context = SP.ClientContext.get_current();
var user = context.get_site().get_rootWeb().ensureUser(email);
this.context.load(user);
this.context.executeQueryAsync(
function (sender, args) {
deferred.resolve(user);
},
function (sender, args) {
deferred.reject(sender, args);
}
);
return deferred.promise();
}
getUserAsPromise("my@email.com")
.fail(function (sender, args) {
console.error(args.get_message());
})
.done(function (user) {
console.log("Success: " + user.get_id());
});