Вернуть значение из асинхронной функции (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);

 

 

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