Promises.all () не разрешается до ответа сервера - PullRequest
0 голосов
/ 26 октября 2018

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

Описания заданий хранятся в базе данных Firestore.

Задания запускаются правильно, моя проблема возвращает ответы Job от облачной функции (сервера).

app.get('/', (req, res) => {

    var dataJob = {};

    var workflow = fs.collection('dataprep-workflows').doc('18c').get()
        .then((workflow) => {

            if (!workflow.exists) throw (new Error('no workflow.'));

            dataJob = workflow.data();

            return workflow.ref.collection('dataflow-jobs').get();
        })
        .then(async (jobs) => {

            if (jobs.empty) throw (new Error('no jobs'));

            const authClient = await _authenticateWithGoogle();

            const dataJobs = jobs.docs.map((job) => {
                var o = JSON.parse(JSON.stringify(dataJob));
                o.jobs = [job.data()];
                return _launchDataFlowTemplate(authClient, o);
            });
            return Promise.all(dataJobs);
        })
        .then((responses) => {
            console.log(responses);
            return res.status(200).send(responses);
        })
        .catch(err => {
            console.error('Error: ', err);
            return res.status(500).send(err);
        });

    return workflow;
});

_authenticateWithGoogle возвращает учетные данные клиента, которые я жду один раз, прежде чем передать их каждому _launchDataFlowTemplate(), который возвращает Обещание

Я думал, что возврат Promises.all() в цепочке разрешится следующим .then()

Чего мне не хватает?

Средство запуска задания потока данных:

function _launchDataFlowTemplate(authClient, dataJob) {

    // code snipped

    const dataflow = google.dataflow({
        version: 'v1b3',
        auth: authClient
    });

    return new Promise((resolve, reject) => {
        dataflow.projects.templates.launch({
                // template resource built from dataJob
            }
        }, (err, response) => {
            if (err) {
                console.error('Dataflow template launch failed because of ', err);
                reject(err);
            } else {
                resolve(response.data.job);
            }
        });
    });
}

Аутентификация:

function _authenticateWithGoogle(scopes) {
    console.log("Authenticating...");

    scopes = scopes || [
        'https://www.googleapis.com/auth/cloud-platform',
        'https://www.googleapis.com/auth/compute',
        'https://www.googleapis.com/auth/compute.readonly',
        'https://www.googleapis.com/auth/userinfo.email'
    ];

    return new Promise((resolve, reject) => {
        google.auth.getApplicationDefault((err, authClient, projectId) => {
            if (err) {
                console.error('Authentication failed because of ', err);
                reject(err);
            }

            if (authClient.createScopedRequired && authClient.createScopedRequired()) {
                authClient = authClient.createScoped(scopes);
                authClient.projectId = projectId;
            }

            console.log('Authenticated.');
            resolve(authClient);
        });
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...