Асинхронные функции в Google AppMaker - PullRequest
0 голосов
/ 14 января 2019

У меня есть функция BigQueryGetEmail(), которая запрашивает информацию менеджера запрашивающей стороны из BigQuery. Я вызываю код, чтобы получить информацию и передать ее в переменную. Но проблема в том, что JS - это однопоточный язык, поэтому я думаю, что он пропускает код, в котором я вызываю функцию BigQueryGetEmail(), прежде чем завершить запрос информации, которая мне нужна. Эффект заключается в том, что когда я присваиваю его переменной, он наверняка выдаст ошибку, потому что данных еще нет.

Я пытался поместить назначение переменной в обратный вызов BigQueryGetEmail(), но все еще не успел собрать данные. Также пробовал асинхронную функцию, но не похоже, что она работает в AppMaker. Функция запроса работает, как и ожидалось, когда я тестирую ее. Возвращает адрес электронной почты менеджера-заявителя.

//run Query to get Manager email info base on requester email
var email = google.script.run.BigQueryGetEmail(emailRequester);

//assign email value to draft.email;
draft.Email = email;

//create record
createDatasource.createItem(function(createdRecord) { });

Я ожидаю, что запрос сначала получит адрес электронной почты диспетчера, а затем передаст значение draft.Email, прежде чем сохранить запись.

1 Ответ

0 голосов
/ 14 января 2019

API на стороне клиента google.script.run имеет обработчик ошибок и обработчик успеха. Чтобы узнать больше о том, как это работает, обратитесь к официальной документации .

По сути, вам нужно реорганизовать код, чтобы он выглядел примерно так:

function successHandler(email){
    //assign email value to draft.email;
    draft.Email = email;

    //create record
    createDatasource.createItem(function(createdRecord) { });
}

function failureHandler(error){
    console.log(error);
}

//run Query to get Manager email info base on requester email
google.script.run.withSuccessHandler(successHandler).withFailureHandler(failureHandler).BigQueryGetEmail(emailRequester);
...