Не могу никак решить вопрос с глобальными переменными и promise angular. У меня есть функция которая получается имя пользователя и возвращает его id.
utilsService.getUserIdByName = function (userName) {
var def = $q.defer();
console.log('zashol');
console.log(userName);
function CallClientOM() {
var clientContext = SP.ClientContext.get_current();
var website = clientContext.get_web();
var currentUser = website.ensureUser(userName);
clientContext.load(website);
clientContext.load(currentUser);
clientContext.executeQueryAsync(onRequestSucceeded, onRequestFailed);
function onRequestSucceeded() {
var userid = currentUser.get_id();
def.resolve(userid);
}
function onRequestFailed(sender, args) {
//error handling
console.log("error" + args.get_message());
def.reject('fail');
}
}
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function () {
CallClientOM();
});
return def.promise;
};
И есть функция в которой я вызываю её и хочу получить обратно id и записать в переменную:
$scope.validateRemoval = function (tag) {
if(!$scope.showfioinitiator)
{
var tagUserId = utilsService.getUserIdByName(tag.account);
var initUserId = utilsService.getUserIdByName($scope.initdata);
console.log(a);
console.log(b);
return false;
}
else
{
return true;
}
};
В переменных tagUserId и initUserId таким вариантом храниться объект ответа promise, а не сам id.
Пробовал такой вариант (Способ 2 - обещания ("промизы", promises)) из статьи Как вернуть значение из события или из функции обратного вызова?:
$scope.validateRemoval = function (tag) {
if(!$scope.showfioinitiator)
{
var tagUserId;
var initUserId;
utilsService.getUserIdByName(userName).then(function(id){
tagUserId = id;
console.log(tagUserId);//МОГУ ПОЛУЧИТЬ id
});
utilsService.getUserIdByName(userName).then(function(id){
initUserId = id;
console.log(initUserId);//МОГУ ПОЛУЧИТЬ id
});
console.log(tagUserId);//НЕ МОГУ ПОЛУЧИТЬ id
console.log(initUserId);//НЕ МОГУ ПОЛУЧИТЬ id
return false;
}
else
{
return true;
}
};
Этот вариант работает нормально и возвращает мне id, но только если я работаю с tagUserId и initUserId внутри функции. За приделами
utilsService.getUserIdByName(userName).then(function(id){
initUserId = id;
console.log(initUserId);
});`
Я не могу получить никак initUserId и tagUserId
async/await– Grundy Nov 09 '16 at 11:21thenкак раз позволят писать код который выполнится только тогда, когда функция вернет значение. Более удобную запись может добавить использование async/await - про них во втором ответе есть. Их пока не добавили в стандарт и не реализовали в браузерах, но можно использовать транспилер babeljs – Grundy Nov 09 '16 at 11:44var result = utilsService.getUserIdByName(userName).then(function(id){ initUserId = id; return initUserId; });– Михаил Nov 09 '16 at 12:00