1

Не могу никак решить вопрос с глобальными переменными и 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

  • Немного не то. У меня уже используется один из методов. – Михаил Nov 09 '16 at 11:20
  • Именно то, там вроде говорится, что по другому никак, пока не добавят async/await – Grundy Nov 09 '16 at 11:21
  • Помогите модернизировать это. Я уже использую второй вариант "Способ 2 - обещания ("промизы", promises)". Может у меня ошибка я прочитал это уже три раза. – Михаил Nov 09 '16 at 11:35
  • Этот вариант работает нормально и возвращает мне id, но только если я работаю внутри функции - именно об этом и говорит этот способ. Нельзя никак получить значения до того как функция выполнится. Так как функция асинхронная - ты не знаешь когда она выполнится. then как раз позволят писать код который выполнится только тогда, когда функция вернет значение. Более удобную запись может добавить использование async/await - про них во втором ответе есть. Их пока не добавили в стандарт и не реализовали в браузерах, но можно использовать транспилер babeljs – Grundy Nov 09 '16 at 11:44
  • Да я это понял. Просто я думал что можно сделать что-то типа такого var result = utilsService.getUserIdByName(userName).then(function(id){ initUserId = id; return initUserId; }); – Михаил Nov 09 '16 at 12:00
  • Пока нельзя. Об этом кстати есть в ответах по ссылке, поэтому я думаю это все-таки полный дубликат того вопроса – Grundy Nov 09 '16 at 12:01

0 Answers0