работа с функциями 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 комментариев

Интересно, вот так сработает?

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("!");
}
Показать все комментарии