Есть код
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"); есть значение. Но оно не возвращается функцией.
Не могу понять специфики, подскажите.
Нравится
Интересно, вот так сработает?
[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]