Есть код
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"); есть значение. Но оно не возвращается функцией.
Не могу понять специфики, подскажите.
Нравится
Интересно, вот так сработает?
var result = response.collection.collection.getItems()[0]; LogCurrencyRate = result.get("Rate");
Не могу понять почему
esq1.getEntityCollection(function(response)
в if (response && response.success) { не попадает
и дальше проходит по коду.
Что не так?
На картинке скрин порядок выполнения.
Может как то связано что в одной функции я использую 2 function(response)
1. esq.getEntityCollection(function(response)
2. esq1.getEntityCollection(function(response)
1 -й работает
2 й нет
"Юсупов Марат" написал:Что не так?
function(response) {...}
Это коллбек от функции esq1.getEntityCollection.
Всё-таки попробуйте
var result = response.collection.collection.getItems()[0];
"Юсупов Марат" написал:Проскакивает
Секунду. Он и должен проскочить. Потом пройдет немного времени, придёт ответ от бд, начнёт отрабатывать
function(response) {...}
У вас так происходит, или вообще ничего не работает(даже спустя некоторое время)?
Добрый день, Марат.
Вы написали не синхронный код и ожидаете от него синхронного поведения. Функция, передаваемая в метод getEntityCollection вызывается асинхронно после ответа от базы данных. Она будет вызвана в другом контексте и уже после того как метод getCurrencyRate отработает.
Вам стоит смотреть в сторону использования атрибутов или же Terrasoft.chain. Атрибуты помогут с кешированием значения. Terrasoft.chain позволит создать цепочку вызовов callback функций.
Илья, спасибо. помогло.
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);
Но вот только еще есть не до понимания...где можно поподробнее о chain узнать?
К примеру есть внешний вызов
debugger; LogCurrencyRate2 = this.getCurrencyRate(LogCurrencyRow.value); if (LogCurrencyRate2 > 0) { LogTotalCostRowCur = (this.get("LogTotalCostRow") * LogCurrencyRate) / LogCurrencyRate2; }
а в this.getCurrencyRate(LogCurrencyRow.value);
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); },
И почему то программа по нему 2 раза проходит...первый раз ок..значения есть...а вторая непонятная проходка уже нет значение.
Документацию о методах chain и next, Вы можете почитать на SDK https://academy.terrasoft.ru/jscoresdk/
Также, судя по предоставленному коду, Вам достаточно вы функции обратного вызова вызывать следующий метод в правильном контексте. Контекст можно задать функцией bind. Упрощенный пример:
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("!"); }