Вопрос

Функция возвращающая результат асинхронной функции

Вот как в функции вернуть не undefined ? :)

proc: function(Id)

{

  return getCallCountForButtonCaption(Id);

Вот как сделать чтобы возвращать не undefined, а результат асинхронного вызова который

аяксом вернется из getCallCountForButtonCaption т. е. синхронизировать асинхронный вызов

}

            getCallCountForButtonCaption: function (candId) {

                this.logStep('getCallCountForButtonCaption started...');

                // Создаем экземпляр класса Terrasoft.EntitySchemaQuery с корневой схемой [Contact].

                

                var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

                    rootSchemaName: "AACandCall"

                });

                // Добавляем колонку с именем основного контакта контрагента, который относится к данному контакту.

                esq.addColumn("CallCount");

                esq.filters.add("filterByIdCand",

                    esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,

                        "IdCand", candId));

                esq.getEntityCollection(function (response) {

                       this.logStep('ForButtonCaption callCount request has started!');

                    if (response.success) {

                        this.logStep('ForButtonCaption callCount response.success is true');

                        if (response.collection.getCount() > 0) {

                            var firstItem = response.collection.getByIndex(0);

                            var callCount = firstItem.values.CallCount;

                            //this.setButtonCaption(callCount);

                            return callCount;

                        }

                        else {

                            this.logStep('ForButtonCaption response.collection.getCount() is ZERO');

                            return -1;

                        }

                        return -1;

                    }

                    else {

                        this.logStep('ForButtonCaption callCount response.success is false');

                        return -1;

                    }

                }, this);

                this.logStep('getCallCount finished...');

            },

 

Нравится

7 комментариев

Добрый день

У вас не получится сделать синхронным асинхронный вызов. Вам нужно сделать bind свойства на атрибут модели, а в обработке callback'а асинхронной функции устанавливать значение того же атрибута

Пример:

diff: [
   {
    ... 
    "caption": {"bindTo": "MyAttribute"}
    ...
   }]
...
methods: {
   someFunction: function() {
       var callback = function(value) {
          this.set("MyAttribute", value);
       }.bind(this);
       this.callAsync(callback);
   }
}

 

Артем Гура,

Спасибо! Смотрится интересно, буду пробовать. Мне интересно как делать в платформе подряд два асинхронных вызова, когда вызов второго зависит от ответа первого. Конкретная задача: юзар нажимает кнопку "позвонить", запросом проверяем в бд первый звонок если да то делаем вызов инсерт иначе апдейт - это уже сделано, но как далее в методе клик кнопки еще и каптион ее поменять с "позвонить" на "позвонить (1, 2, 3)" Вроде ваш ответ поможет, спасибо. Какая практика по подобным сценариям, ща осваиваю фронтэнд, в основном на c# писал и куча приколов...

Артем Гура,

Попробую спросить в более точной форме. 

Дано:

        attributes: {

            "IsButtonVisible": {

                "dataValueType": Terrasoft.DataValueType.BOOLEAN,

                "value": false

            },

            "ButtonCaption": {

                "dataValueType": Terrasoft.DataValueType.TEXT,

                "value": "Позвонить"            

            }

        },

        diff: [{

            "operation": "insert",

            "name": "bnBackCall",

            "parentName": "DataGrid",

            "propertyName": "activeRowActions",

            "index": 111,

            "values": {

                "className": "Terrasoft.Button",

                "style": Terrasoft.controls.ButtonEnums.style.GREY,

                "caption": { "bindTo": "ButtonCaption" },

                "tag": "tagBnBackCall"

            }

        },

Где мне нужно менять каптион кнопки моей, по логике в 

rowSelected: function(Id) 

            {

                //this.setButtonCaption(Id);

                this.set("ButtonCaption", "КАПТИОН");

            },

Но так не работает, при этом мне нужно устанавливать каптион в зависимости от значения прочитанного с БД (это умею), но эта функция чтения асинхронная, как это нормально сделать???

QArt,

Попробуйте сделать присвоение caption в отдельном методе, а уже в методе клика на кнопку можно вызывать его.

Demchenko Olha,

Спасибо, пробовал. Пришлось через js править, плохо что у террасофт если рендеринг поменяется в следующей версии то придется править. Каптион - волшебный, не меняется через атрибуты и ресурсы советовали, но тоже самое биндинг с полем каптион не помогает.

QArt,

Почитайте документацию 

https://academy.terrasoft.ru/documents/technic-sdk/7-11/dobavlenie-knop…, там и примеры есть реализации. Попробуйте сделать как там, просто вывести кнопку с caption через привязку к локализируемой строке схемы, не делая значение изменяемым. А когда уже получится стандартную кнопку вывести, тогда и пробуйте экспериментировать.

Demchenko Olha,

Хорошо, спасибо :) Все-таки, кнопка выводится - ок, ее каптион биндится к атрибуту, меняя атрибут сам каптион не меняется. 

Показать все комментарии