Ожидание обратного вызова хранилища данных в облачных функциях Google (Node-JS) - PullRequest
0 голосов
/ 25 июня 2018

Я занимаюсь разработкой облачных функций Google, которая вызывает задание потока данных, и храню в хранилище данных идентификатор задания потока данных. Эта часть отлично работает.

Моя проблема связана с другой облачной функцией (запущенной через HTTP), которая читает хранилище данных. Кажется, что облачная функция полностью асинхронна и завершается до того, как функция хранилища данных отправляет некоторые данные.

Я взял пример хранилища данных из исходного api хранилища данных node-js https://github.com/googleapis/nodejs-datastore/blob/master/samples/tasks.js

Мой код:

exports.processJobs = (req, res) => {
jobList = "";
console.log(`  INIT processJobs`);
const query = datastore.createQuery('Job').filter('finished', '=', false);
datastore
.runQuery(query)
.then(results => {
    const jobs = results[0];

    console.log('Jobs:');
    jobs.forEach(job => {
        const jobKey = job[datastore.KEY];
        console.log(jobKey, job);
        jobList = jobList + job.jobId;
    });
})
.catch(err => {
    console.error('ERROR:', err);
});
console.log(`  END processJobs`);
res.status(200).send(":" + jobList);
}

Если я просматриваю журнал, сгенерированный моей функцией, я показываю, что функция завершается, и после этого она отображает задания в консоли:

2018-06-25 13:58:00.496  Function execution took 384 ms, finished with status code: 200
2018-06-25 13:59:14.774  Jobs:
2018-06-25 13:59:16.191  undefined { jobId: '2018-06-25_01_07_33-9128665201904101921',
                                                         beginTime: 2018-06-25T08:07:34.980Z,
                                                         finished: false,
                                                         status: 'JOB_STATE_RUNNING' }

UPDATE

Решение перемещает ответ на часть «затем», как было запрошено в решении:

datastore
.runQuery(query)
.then(results => {
    const jobs = results[0];
    console.log('Jobs:');
    jobs.forEach(job => {
        const jobKey = job[datastore.KEY];
        console.log(jobKey.id, job);
        jobList = jobList + job.jobId;

    });
    res.status(200).send("Response:_" + jobList );
})

1 Ответ

0 голосов
/ 25 июня 2018

Это потому, что вы отправляете ответ до получения результатов.После выполнения res.status().send() облачные функции блокируют ресурсы вашей функции и очищают ее, возможно, останавливая любую асинхронную работу, которая еще выполняется.

Вам нужно подождать, пока вся асинхронная работа будет выполнена, прежде чем отправлять ответ,Это означает, что вам, вероятно, следует переместить ответ в блоки then и catch вашего обещания хранилища данных, чтобы ответ отправлялся только после завершения работы.

Для получения дополнительной информации см. Документацию и примеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...