Получить поле раздела без использования callback

Добрый день!

Подскажите, можно ли получить в сценарии javascript город контрагента без использования функции callback?

Сейчас знаю только реализацию через callback, например:

qetCity : function (stringValue, callback) {
        var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName : "Account"});
        esq.addColumn("Id");
        esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id", account.value));
        esq.getEntityCollection(function (result) {
                if (result.success) {
                        var items = result.collection.getItems();
                        var City = [];
                        this.Terrasoft.each(items, function (item) {
                                City.push(item.get("Id"));
                        }, this);
                        callback.call(this, City);
                }
        }, this);
},
showCity : function () {
        this.qetCity("ASP; C++; C#", function (City) {
                var City = this.getIds("ASP; C++; C#", function (City);
        });
}

Нравится

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

Если речь про карточку или реестр (на основе базовых), то есть способы). А в общем случае, как я понимаю, нельзя - т.к. запрос-ответ, асинхронность и все такое.
Но если можно, тоже было бы интересно узнать, как.

"Андросов Дмитрий" написал:

Если речь про карточку или реестр (на основе базовых), то есть способы). А в общем случае, как я понимаю, нельзя - т.к. запрос-ответ, асинхронность и все такое.

Но если можно, тоже было бы интересно узнать, как.

А если о карточке, то какие есть способы?

Если это поле из текущего объекта (в карточке Контакта - Контакт)

this.get("КодПоля");

Если это справочное поле (в карточке Контакта - Контрагент)

//в атрибутах добавить/изменить атрибут этого справочника
"Account": {
	lookupListConfig:{
		//вроде бы влияет на данные, подтягиваемые из справочника при выборе
		columns: ["Country", "Owner"]
	},
	//вроде бы влияет на данные, подтягиваемые из справочника при открытии ранее сохраненной записи
	columns: ["Country", "Owner"]
}
 
// в методах получить можно будет так
var Account = this.get("Account");
if (Account && Account.value) {
	var Country = Account.Country;
	var Owner = Account.Owner;
}

Если контрагент никак не связан с текущей карточкой, то на init, записать нужные города в переменные (все равно колбэками), но зато абстрагированно от остального кода) и использовать далее уже эти переменные.
Но, может, лучше разобраться с колбэками?

"Андросов Дмитрий" написал:

Если контрагент никак не связан с текущей карточкой, то на init, записать нужные города в переменные (все равно колбэками), но зато абстрагированно от остального кода) и использовать далее уже эти переменные.

Но, может, лучше разобраться с колбэками?

У меня итак уже один callback вложенный в другой. Еще одно вложение делать делать пока не очень хотелось бы...
Вариант с атрибутами тоже не подходит.

Возможно вам подойдет вариант через Entity

var AccountId = "..."; //GUID контрагента

var select = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Account"
});
select.addColumn('City.Name', 'CityName');
select.filters.add(select.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "Id", AccountId, Terrasoft.DataValueType.TEXT));
select.getEntityCollection(function(result) {
if (result.success) {
var collection = result.collection;
collection.each(function(item) {
console.log(item.get("CityName")); !!! Ваши города
}, this);
}
}, this);

"Вильшанский Дмитрий" написал:вариант через Entity

хаха точно

"Вильшанский Дмитрий" написал:

Возможно вам подойдет вариант через Entity

var AccountId = "..."; //GUID контрагента

var select = Ext.create("Terrasoft.EntitySchemaQuery", {

rootSchemaName: "Account"

});

select.addColumn('City.Name', 'CityName');

select.filters.add(select.createColumnFilterWithParameter(

Terrasoft.ComparisonType.EQUAL, "Id", AccountId, Terrasoft.DataValueType.TEXT));

select.getEntityCollection(function(result) {

if (result.success) {

var collection = result.collection;

collection.each(function(item) {

console.log(item.get("CityName")); !!! Ваши города

}, this);

}

}, this);

Дмитрий, но в этом случае select.getEntityCollection(function(result) разве не является callback?

Александра, у нас запросы к базе данных происходит в асинхронном режиме (через callback можно получить результат). Вариант синхронного запроса у нас не используется из-за того, что это замедляет работу приложения.

"Вильшанский Дмитрий" написал:

Александра, у нас запросы к базе данных происходит в асинхронном режиме (через callback можно получить результат). Вариант синхронного запроса у нас не используется из-за того, что это замедляет работу приложения.

Понятно. Спасибо за информацию.

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