Как отловить ошибку при savechanges - google app maker

Пытаюсь отловить ошибку при создании новой записи в источнике данных. (Источник данных настроен на прием только уникальных значений в одном из полей.)

При попытке вызвать ошибку запускается скрипт на стороне клиента и отображается последнее всплывающее окно с сообщением об успешном создании новой записи. Вместо отображения всплывающего окна с сообщением об ошибке при создании записи.

Я поговорил с одним из наших старших разработчиков, и он объяснил, что проблема связана с асинхронным запуском saveChanges. (Вызов сохранения изменений выполняется без ошибок и только после его завершения возвращает ошибку.)

Итак, мой вопрос: как мне отловить ошибку после завершения saveChanges и отобразить всплывающее окно. (Если запись создана успешно или не удалось.)

Мой код:

//Creates New Stores
function createNewStores() {  

var newCert = '{"ShopCertificates":[{"Certificate_ID":"","Certificate_Name":"","Valid_From":"","Valid_To":"","Renewal_Date":"","Date_Applied_For_Renewal":"","Date_Compliance_Received":"","Date_Compliance_Issues_Resolved":"","Compliance_Notice_Date":"","Certificate_URL":""}]}';

//Get the Datasource, set it to create mode and create a new blank item.
var createDatasource = app.datasources.Stores.modes.create;
var draft = createDatasource.item;

//Get the selected values from the page.
var brand = app.pages.A_Add_Store.descendants.Dropdown_Brand_Selector.value;
var division = app.pages.A_Add_Store.descendants.Dropdown_Division_Selector.value;
var storeName = app.pages.A_Add_Store.descendants.Dropdown_Stores_Selector.value;

//Set the values of the draft record to be the values entered in the form.
draft.StoreId = parseInt(storeName);
draft.Brand = brand;
draft.Division = division;
draft.Store_Name = storeName;
draft.Cert_JSON = newCert;

//Create the new record in the datasource and save changes to the datasource.
try{
createDatasource.createItem();
app.datasources.Stores.saveChanges();
}
catch(err){
app.popups.Error_Store_Already_Exists.visible = true;
}

//After record is created set values in form to null.
app.pages.A_Add_Store.descendants.Dropdown_Brand_Selector.value = null;
app.pages.A_Add_Store.descendants.Dropdown_Division_Selector.value = null;
app.pages.A_Add_Store.descendants.Dropdown_Stores_Selector.value = null;

//Display Popup stating store has been added.
app.popups.New_Store_Added.visible = true;
}
0
0
472
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что ваш источник данных Stores установлен в режим «Сохранение вручную», должно работать следующее:

Замените этот раздел кода:

try{
createDatasource.createItem();
app.datasources.Stores.saveChanges();
}
catch(err){
app.popups.Error_Store_Already_Exists.visible = true;
}

С этим:

createDatasource.createItem();
app.datasources.Stores.saveChanges({
  success: function() {
    app.popups.New_Store_Added.visible = true;
  },
  failure: function() {
    app.popups.Error_Store_Already_Exists.visible = true;
  }
});

Если ваш источник данных настроен на автоматическое сохранение, функция saveChanges () будет проигнорирована, и вы не сможете передать обратный вызов в этой функции. Пожалуйста, обратитесь к разделу асинхронных операций в документации здесь https://developers.google.com/appmaker/scripting/client#asynchronous_operations.

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

Источник данных установлен в режим ручного сохранения, правильно. Скоро это проверим. Спасибо, Маркус.

New_2_Code 31.10.2018 14:50

Сработало именно так, как я надеялся. Спасибо, Маркус!

New_2_Code 31.10.2018 14:54

Другие вопросы по теме