Google Cloud SQL не обновляется скриптом - PullRequest
1 голос
/ 18 марта 2019

У меня длинный скрипт, предназначенный для редактирования определенной строки в таблице Cloud SQL.Код длинный, поэтому я его укоротю.

На стороне клиента:

function build_profile(){
var cbid = sessionStorage.getItem("client_id");
var self = this;
var createSuccess = function(data){
  var statuse = ["Active", "Wiating", "Discharged"];
  if(data !== false){
    data = data.split(",");
    var dec = app.pages.Profile.descendants;
    dec.fname.text = data[1];
    dec.sname.text = data[3];
    sessionStorage.setItem("school_id", data[9]);
    app.popups.Loading.visible = false;
  }
  };
var init = function() {google.script.run.withSuccessHandler(createSuccess).get_user_data(cbid);};
app.popups.Loading.visible = true;
init();
}

function save_profile() {
var createSuccess = function(data){
var dec = app.pages.Profile.descendants;
console.log(data);
if(data !== -1){
  var ds = app.datasources.Clients;
  ds.load(function(){
    ds.selectIndex(data);
    console.log("editing:"+ds.item.CBID);
    ds.item.fname = dec.fname_edit.value;
    ds.item.sname = dec.sname_edit.value;
    ds.load(function(){build_profile();});
  });
}
}};
var init = function() {google.script.run.withSuccessHandler(createSuccess).update_client(sessionStorage.getItem("client_id"));};
init();
}

На стороне сервера:

function get_user_data(cbid){
try{
var query = app.models.Clients.newQuery();
query.filters.CBID._equals = parseInt(cbid);
var results = query.run();
if(results.length > 0){
  var arr = [
    results[0].Id, //0
    results[0].fname, //1
    results[0].sname //3
      ];
    return arr.join(",");
  }else{
    return false;
  }
  }catch(e){
  console.error(e);
  console.log("function get_user_data");
  return false;
  }
}
function update_client(cbid) {
  try{
    var ds = app.models.Clients;
    var query = ds.newQuery();
    query.filters.CBID._equals = parseInt(cbid);
    var results = query.run();
    if(results.length > 0){
      var id = results[0]._key;
      return id+1;
    }else{
      return -1;
    }
  }catch(e){
    console.error(e);
    return -1;
  }
}

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

РЕДАКТИРОВАТЬ: мне удалось добраться до точки, где он говорит мне, что я не могу выполнить запрос (ds.load ()) при обработке его результатов,Похоже, что нет ручной проверки, чтобы убедиться, что она обработана?

Примечание: datasource.saveChanges () не работает, так как сохраняет автоматически.

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

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

function client_query_and_result(){
  var createSuccess = function(data){ //callback function
    console.log(data);
  };
  app.datasources.SomeTable.saveChanges(function(){//ensures all changes have been saved
    app.datasources.SomeTable.load(function(){//makes sure to reload the datasource
      google.script.run.withSuccessHandler(createSuccess).server_query_and_result(); //at this point All data has been saved and reloaded
    });
  });
}

Код на стороне сервера - те же самые методы. Чтобы включить ручное сохранение, выберите таблицу в App Maker -> Источники данных -> установите флажок «Режим ручного сохранения».

Надеюсь, это может быть полезно кому-то еще.

0 голосов
/ 18 марта 2019

Ошибка выдается клиентской функцией save_profile () , и она находится именно в этом блоке:

  ds.load(function(){
    ds.selectIndex(data);
    console.log("editing:"+ds.item.CBID);
    ds.item.fname = dec.fname_edit.value;
    ds.item.sname = dec.sname_edit.value;
    ds.load(function(){build_profile();});
  });

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

не может выполнить запрос (ds.load ()) при обработке его результатов

Это просто вопрос времени. A setTimeout может решить проблему. Просто сделайте следующее:

ds.load(function(){
  ds.selectIndex(data);
  console.log("editing:"+ds.item.CBID);
  ds.item.fname = dec.fname_edit.value;
  ds.item.sname = dec.sname_edit.value;
  setTimeout(function(){
      ds.load(function(){build_profile();});
  },1000);
});
...