none
Нужно дождаться выполнения executeQueryAsync и получить результат... RRS feed

  • Вопрос

  • Добрый день.

    Есть JS-скрипт, который выполняет CAML запрос и в зависимости от результата, функция должна вернуть TRUE или FALSE

    Проблема в том, что из-за асинхронного выполнения функция получает неверный результат. 

    executeQueryAsync выполняется чуть медленнее, и в результате в return результат выполнения не попадает.

    Как можно выйти из ситуации? Подскажите плиз!

    24 июля 2017 г. 11:47

Ответы

  • Добрый день

    можно обернуть в промис

    вот пример 

    // получение текущего пользователя 
    function getCurrentUser() {
        var dfd = jQuery.Deferred();
        var currentUser;
        if (SP.ClientContext != null) {
            SP.SOD.executeOrDelayUntilScriptLoaded(getUser, 'sp.js');
        }
        else {
            SP.SOD.executeFunc('sp.js', null, getUser);
        }
        function getUser() {
            var context = new SP.ClientContext.get_current();
            var web = context.get_web();
            currentUser = web.get_currentUser();
            context.load(currentUser);
            context.executeQueryAsync(onSuccessMethod, onRequestFail);
        }
        function onSuccessMethod(sender, args) {
            //currUser = currentUser;
            dfd.resolve(currentUser);
        }
        function onRequestFail(sender, args) {
            console.log('ошибка получения пользователя' + args.get_message() + '\n' + args.get_stackTrace());
            dfd.reject(args);
        }
    
        return dfd.promise();
    };
    

    вот как применяется 


    мой блог не много о SharePoint

    24 июля 2017 г. 12:45
    Модератор

Все ответы

  • Подгрузите в DOM sp.js для ClientContext:

    $(document).ready(function () {
            //don't exectute any jsom until sp.js file has loaded.        
            SP.SOD.executeFunc('sp.js', 'SP.ClientContext', MyFunction);
        });

    24 июля 2017 г. 12:06
  • Подгрузите в DOM sp.js для ClientContext:

    $(document).ready(function () {
            //don't exectute any jsom until sp.js file has loaded.        
            SP.SOD.executeFunc('sp.js', 'SP.ClientContext', yorfunction);
        });

    Боюсь спросить, а что это даст?
    24 июля 2017 г. 12:10
  • Добрый день

    можно обернуть в промис

    вот пример 

    // получение текущего пользователя 
    function getCurrentUser() {
        var dfd = jQuery.Deferred();
        var currentUser;
        if (SP.ClientContext != null) {
            SP.SOD.executeOrDelayUntilScriptLoaded(getUser, 'sp.js');
        }
        else {
            SP.SOD.executeFunc('sp.js', null, getUser);
        }
        function getUser() {
            var context = new SP.ClientContext.get_current();
            var web = context.get_web();
            currentUser = web.get_currentUser();
            context.load(currentUser);
            context.executeQueryAsync(onSuccessMethod, onRequestFail);
        }
        function onSuccessMethod(sender, args) {
            //currUser = currentUser;
            dfd.resolve(currentUser);
        }
        function onRequestFail(sender, args) {
            console.log('ошибка получения пользователя' + args.get_message() + '\n' + args.get_stackTrace());
            dfd.reject(args);
        }
    
        return dfd.promise();
    };
    

    вот как применяется 


    мой блог не много о SharePoint

    24 июля 2017 г. 12:45
    Модератор
  • Спасибо, Владимир.

    Но мне не совсем понятно что будет в 

    dfd.promise() ?

    Точнее как мне сделать, чтобы если CAML запрос вернет забисей больше 0 то функция возвращала бы true или false когда 0 записей?

    вот часть моего кода:

    clContext.load(tasksItm);
    	
    clContext.executeQueryAsync(function () {
           	deferred.resolve(tasksItm);
    }, function () {
            deferred.reject();
    });	
    
    return deferred.promise();
    

    в return (по идее) должно быть такое условие:

    return tasksItm.get_count() > 0
    но я не знаю как его увязать с 
    deferred.promise();

    Спасибо.

    24 июля 2017 г. 13:12
  • как то так 

    // функция для получения данных

    function getAllTasks() { var dfd = jQuery.Deferred(); var tasksItm; if (SP.ClientContext != null) { SP.SOD.executeOrDelayUntilScriptLoaded(getTask, 'sp.js'); } else { SP.SOD.executeFunc('sp.js', null, getTask); } function getTask() { // тут ваш запрос } function onSuccessMethod(sender, args) { deferred.resolve(tasksItm); } function onRequestFail(sender, args) { dfd.reject(args); } return dfd.promise(); }; // код проверки значения var queryTask = getAllTasks(); // происходит запрос требуемых данных, на выходе промис queryTask.done(function (res) { // условие выполниться когда сервер вернет данные и не будет ошибок console.log(res); // тут будет данные положенные тут deferred.resolve(tasksItm); }); queryTask.fail( function (err)){ // условие выполниться когда сервер вернет данные и была ошибка console.log(err); };



    мой блог не много о SharePoint



    24 июля 2017 г. 13:58
    Модератор
  • Владимир, так мне проверять главное условие "tasksItm.get_count() > 0" в какой функции из Вашего примера?

    Я поясню к чему мне всё это - я по условию tasksItm.get_count() > 0 хочу открыть или закрыть кнопку на риббоне списка. И в xml-файле описания, на "EnableScript" указана JS - функция. Она должна вернуть либо TRUE либо FALSE.


    25 июля 2017 г. 2:15
  • в блоке 

    queryTask.done(function (res) { // условие выполниться когда сервер вернет данные и не будет ошибок console.log(res); // тут код который будет скрывать или показывать кнопку на основании результата res

    // что то типа if(res.get_count() > 0){}; });



    мой блог не много о SharePoint


    25 июля 2017 г. 7:22
    Модератор
  • Спасибо!
    26 июля 2017 г. 4:32
  • Спасибо!
    получилось?

    мой блог не много о SharePoint

    26 июля 2017 г. 9:38
    Модератор