Технические вопросы
7.x

работа с функциями javascript возвращение результата

Есть код

getCurrencyRate: function(LogCurrencyRow) {
                                var LogCurrencyRate = 0;
                               
                                var esq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "CurrencyRate"});
                                esq.addColumn("Rate");
                                var _tomorrow = new Date();
                                _tomorrow.setDate(_tomorrow.getDate() + 1);
                                var _yesterday = new Date();
                                _yesterday.setDate(_yesterday.getDate() - 1);
                               
                                _tomorrow = Terrasoft.endOfDay(_tomorrow);
                                _yesterday = Terrasoft.startOfDay(_yesterday);
                               
                               
                                esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                this.Terrasoft.ComparisonType.EQUAL, "Currency", LogCurrencyRow));
                                esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                this.Terrasoft.ComparisonType.GREATER, "StartDate", _yesterday));
                                esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                this.Terrasoft.ComparisonType.LESS, "StartDate", _tomorrow));

                                esq.getEntityCollection(function(response) {
                                        if (response && response.success) {
                                                if (response.collection.getCount() > 0) {
                                                        var result = response.collection.getItems()[0];
                                                        LogCurrencyRate = result.get("Rate");
                                                } else {
                                                        LogCurrencyRate = 0;
                                                }
                                               
                                        }
                                        else {
                                                LogCurrencyRate = 0;
                                        }
                                }, this);
                                return LogCurrencyRate;
                        },

result.get("Rate"); есть значение. Но оно не возвращается функцией.

Не могу понять специфики, подскажите.

Нравится

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

Интересно, вот так сработает?
[javascript]
var result = response.collection.collection.getItems()[0];
LogCurrencyRate = result.get("Rate");
[/javascript]

Не могу понять почему
esq1.getEntityCollection(function(response)
в if (response && response.success) { не попадает
и дальше проходит по коду.
Что не так?

На картинке скрин порядок выполнения.

Может как то связано что в одной функции я использую 2 function(response)

1. esq.getEntityCollection(function(response)
2. esq1.getEntityCollection(function(response)

1 -й работает
2 й нет

"Юсупов Марат" написал:Что не так?

[javascript]
function(response) {...}
[/javascript]
Это коллбек от функции esq1.getEntityCollection.
Всё-таки попробуйте [javascript]
var result = response.collection.collection.getItems()[0];
[/javascript]

Данила он туда даже не попадает. Проскакивает.

"Юсупов Марат" написал:Проскакивает

Секунду. Он и должен проскочить. Потом пройдет немного времени, придёт ответ от бд, начнёт отрабатывать [javascript]
function(response) {...}
[/javascript]
У вас так происходит, или вообще ничего не работает(даже спустя некоторое время)?

Спустя некоторое происходит но уже значений нет.

Добрый день, Марат.

Вы написали не синхронный код и ожидаете от него синхронного поведения. Функция, передаваемая в метод getEntityCollection вызывается асинхронно после ответа от базы данных. Она будет вызвана в другом контексте и уже после того как метод getCurrencyRate отработает.

Вам стоит смотреть в сторону использования атрибутов или же Terrasoft.chain. Атрибуты помогут с кешированием значения. Terrasoft.chain позволит создать цепочку вызовов callback функций.

Илья, спасибо. помогло.
[javascript]
Terrasoft.chain(
function(next) {
//запрос
var selectRate = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "CurrencyRate"});
selectRate.addColumn("Rate");
var _tomorrow = new Date();
_tomorrow.setDate(_tomorrow.getDate() + 1);
var _yesterday = new Date();
_yesterday.setDate(_yesterday.getDate() - 1);

_tomorrow = Terrasoft.endOfDay(_tomorrow);
_yesterday = Terrasoft.startOfDay(_yesterday);

// если у нас рубль то берем курс валюты сверху
if (LogCurrencyRow.value === LogConstants.Currency.rub) {
selectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Currency", LogCurrencySCC.value));
} else {
selectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Currency", LogCurrencyRow.value));
}
selectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.GREATER, "StartDate", _yesterday));
selectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.LESS, "StartDate", _tomorrow));
selectRate.getEntityCollection(function(response) {
if (response && response.success) {
if (response.collection.getCount() > 0) {
var result = response.collection.getItems()[0];
this.set("LogCurRate2SCC", result.get("Rate"));
this.save({isSilent: true});
next();
}
}
}, this);
},
function(next) {
//обработка данных запросов
if (this.get("LogCurrencyRow").value === 0 || this.get("LogCurrencyRow").value === "") {
var currencyIN = null;
switch (LogCurrencyRow.value) {
//доллар
case (LogConstants.Currency.usd) :
currencyIN = "usd";
break;
//евро
case (LogConstants.Currency.eur) :
currencyIN = "eur";
break;
}
var serviceData = {
param: currencyIN
};
ServiceHelper.callService("LogGetCurrencyCBRF", "getCurrencyFromCBRF",
function(response) {
if (response.getCurrencyFromCBRFResult >= 0) {
this.set("LogCurRate2SCC", response.getCurrencyFromCBRFResult);
} else {
this.showInformationDialog(response.getCurrencyFromCBRFResult);
}
},
serviceData, this);
this.save({isSilent: true});
next();
}
else {
next();
}
},
function(next) {
//вычисляем итоговую стоимость в валюте РСП
this.calculateCostCur(LogCurrencySCC, LogCurrencyRow, this.get("LogCurRate2SCC"));
next();
},
this);
[/javascript]

Но вот только еще есть не до понимания...где можно поподробнее о chain узнать?

К примеру есть внешний вызов
[javascript]
debugger;
LogCurrencyRate2 = this.getCurrencyRate(LogCurrencyRow.value);
if (LogCurrencyRate2 > 0) {
LogTotalCostRowCur = (this.get("LogTotalCostRow") * LogCurrencyRate) / LogCurrencyRate2;
}
[/javascript]
а в this.getCurrencyRate(LogCurrencyRow.value);

[javascript]
getCurrencyRate: function(LogCurrencyRow) {
debugger;
var LogCurrencyRate = 0;
var _tomorrow = new Date();

_tomorrow.setDate(_tomorrow.getDate() + 1);
var _yesterday = new Date();
_yesterday.setDate(_yesterday.getDate() - 1);

_tomorrow = Terrasoft.endOfDay(_tomorrow);
_yesterday = Terrasoft.startOfDay(_yesterday);

Terrasoft.chain(
function(next) {
//запрос
var SelectRate = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "CurrencyRate"});
SelectRate.addColumn("Rate");

SelectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Currency", LogCurrencyRow));
SelectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.GREATER, "StartDate", _yesterday));
SelectRate.filters.addItem(Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.LESS, "StartDate", _tomorrow));

SelectRate.getEntityCollection(function(response) {
if (response && response.success) {
if (response.collection.getCount() > 0) {
var result = response.collection.getItems()[0];
LogCurrencyRate = result.get("Rate");
next();
}
}
}, this);

},
function(next) {
return LogCurrencyRate;
},
this);
},
[/javascript]

И почему то программа по нему 2 раза проходит...первый раз ок..значения есть...а вторая непонятная проходка уже нет значение.

Документацию о методах chain и next, Вы можете почитать на SDK https://academy.terrasoft.ru/jscoresdk/

Также, судя по предоставленному коду, Вам достаточно вы функции обратного вызова вызывать следующий метод в правильном контексте. Контекст можно задать функцией bind. Упрощенный пример:

[javascript]
test: function() {
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Lead"
});
esq.addColumn("CreatedOn");
esq.execute(function(response){
if(response.success){
this.save({isSilent: true});
this.other();
}
}.bind(this));
},
other: function() {
alert("!");
}
[/javascript]

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