Вернуть значение из асинхронной функции (ESQ)

Добрый день. Необходимо написать функцию, которая подсчитывает количество значений в записи. Проблема в том, что из-за того что esq выполняется асинхронно, функция всегда возвращает undefined. Нужно как-то вернуть из нее значение, так как функция будет использоваться повторно. Как это пофиксить? Спасибо.

 

             /**
             * Подсчет количества продуктов в детали.
             */
            checkProductsCount: function() {
                var select = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                    rootSchemaName: "OpportunityProductInterest"
                });
                    
                var esqRestaurantFilter = Terrasoft.createColumnFilterWithParameter(
                Terrasoft.ComparisonType.EQUAL, "Opportunity.Id", this.get("Id"));
                select.filters.add("selectFilter", esqRestaurantFilter);
                
                var selectedProductsCount = select.getEntityCollection(function(result) {
                    try {
                        if (!result.success) {
                            throw new Error("Ошибка запроса данных");
                        }
                    
                        return result.collection.getCount();
                    }
                    catch (e) {
                        Terrasoft.showErrorMessage(e.message);
                    }
                }, this);
                return selectedProductsCount;
            }

Нравится

1 комментарий
Лучший ответ

Результат функции вы можете записать в атрибут либо сразу в поле через this.set

this.set("Filed", value)

Если после вычитки значений нужные еще какие-то действия, можно на атрибут повесить метод-обработчик по изменению атрибута (свойство dependencies). Подробнее про вычисляемые поля тут:  https://academy.terrasoft.ru/documents/technic-sdk/7-16/dobavlenie-vych…

Так же вы можете столкнуться с тем, что в callback'е от вызова функции getEntityCollection не будет доступа к полям (на самом деле просто другой контекст в this будет), в этом случае следует перед выполнением запроса записать this в другую переменную:

var self = this.

 

var self = this;
 
//ну и далее
var selectedProductsCount = select.getEntityCollection(function(result) {
                   if (result && result.success) {
                    self.set("Filed", value);
                        }
                }, this);

 

 

Результат функции вы можете записать в атрибут либо сразу в поле через this.set

this.set("Filed", value)

Если после вычитки значений нужные еще какие-то действия, можно на атрибут повесить метод-обработчик по изменению атрибута (свойство dependencies). Подробнее про вычисляемые поля тут:  https://academy.terrasoft.ru/documents/technic-sdk/7-16/dobavlenie-vych…

Так же вы можете столкнуться с тем, что в callback'е от вызова функции getEntityCollection не будет доступа к полям (на самом деле просто другой контекст в this будет), в этом случае следует перед выполнением запроса записать this в другую переменную:

var self = this.

 

var self = this;
 
//ну и далее
var selectedProductsCount = select.getEntityCollection(function(result) {
                   if (result && result.success) {
                    self.set("Filed", value);
                        }
                }, this);

 

 

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