Ждать выполнение ServiceHelper.callService

Исходные данные JS-кода.
Атрибут.

"ArticleName": {
  "dataValueType": this.Terrasoft.DataValueType.TEXT,
  "type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
  "value": ""
},

Метод получения значения атрибута

getArticleName: function() {
  var articleName = this.get("ArticleName");
  return articleName ? articleName : "";
},

Метод кнопки

onGetArticleNameClick: function () {
// Первый запуск - <пусто>
// Последующие запуски - <наименование>
this.showInformationDialog(this.getArticleName());
this.set("ArticleName", "");
// Данные реестра.
var gridData = this.getGridData();
if (gridData) {
  var activeRow = this.getActiveRow();
  if (activeRow) {
    // Поле Id.
    var activeRowId = activeRow.get("Id");
    if (activeRowId)
    {
      var serviceData = { id: activeRowId };
      ServiceHelper.callService("VSKBSourceCodeServices", "GetArticleName", 
        function (response) {
          var result = response.GetArticleNameResult;
          this.set("ArticleName", result);
        }, serviceData, this);
    }
  }
}
// Всегда <пусто>
this.showInformationDialog(this.getArticleName());
},

Не могу понять, почему ServiceHelper.callService не заполняет значение атрибута ArticleName сразу? Ощущение, как будто вызов клиентского веб-сервиса GetArticleName выполняется асинхронно.

Нравится

3 комментария
Лучший ответ

Здравствуйте! Данная проблема связана из-за асинхронности js ф-ция обратного вызова запускается в другом потоке и контекст this - уже не виден. Вам нужно до вызова ServiceHelper объявить переменную, например scope и записать в нее this:
 var scope = this; 

а в ф-ции обратного вызова уже писать:
scope .set("ArticleName", result);
Как то так, должно стработать.

Здравствуйте! Данная проблема связана из-за асинхронности js ф-ция обратного вызова запускается в другом потоке и контекст this - уже не виден. Вам нужно до вызова ServiceHelper объявить переменную, например scope и записать в нее this:
 var scope = this; 

а в ф-ции обратного вызова уже писать:
scope .set("ArticleName", result);
Как то так, должно стработать.

Нигрескул Алексей,

Спасибо за ответ, внутри функции обратного вызова удалось задать значение атрибута.
Но, проблема в том, что мне нужно дождаться выполнения 

ServiceHelper.callService, и затем выполнить обращение к этому атрибуту.

Дамиан, так это вызов из браузера отдельного сервиса на серверной стороне, он может выполняться как угодно долго. Для этого и предусмотрена функция, запускаемая при получении ответа.

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