Как ждать данные перед следующим выполнением в node.js - PullRequest
0 голосов
/ 30 апреля 2019

Как дождаться данных, прежде чем запускать следующее выполнение в node.js.Например, у меня 3 части должны быть выполнены.Соберите данные из таблицы заданий, соберите данные из таблицы транспортных средств и запустите файл JAR.Таким образом, текущий вывод консоли составляет 0->1->3->5->7->2->4->6.Как сделать так, как 0->1->3->2->4->5->6->7.Я хочу дождаться данных из первого и второго запроса, а затем запустить файл JAR.

var express = require('express');
var router = express.Router();

router.post('/', function(req, res, next) {
    //console.log("pending data");

    console.log("0");

    var date = req.param('date');
    var joblist;
    var vehiclelist;

    console.log("1");

    res.locals.connection.query('SELECT * FROM job WHERE date = ?',[date] , function (error, results, fields) {
        console.log("2");
        if (error) throw error;
        joblist = JSON.stringify(results);
    });

    console.log("3");

    res.locals.connection.query('SELECT * FROM vehicle ' , function (error, results, fields) {
        console.log("4");
        if (error) throw error;
        vehiclelist = JSON.stringify(results);
    });

    console.log("5");

    var exec = require('child_process').exec, child;
child = exec('java -jar /home/java/testinput.jar',
  function (error, stdout, stderr){
    //console.log('stdout: ' + JSON.stringify(stdout));
    //console.log('stderr: ' + stderr);
    console.log("6");
    res.send(joblist+"  "+stderr);
    if(error !== null){
      console.log('exec error: ' + error);
    }
});
console.log("7");

});

module.exports = router;

1 Ответ

2 голосов
/ 30 апреля 2019

Проблема в том, что следующее:

function (error, results, fields) {
    console.log("2");
    if (error) throw error;
    joblist = JSON.stringify(results);
}

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

В более ранние дни решением этой проблемы было бы определение всех последующих действий внутри этой функции обратного вызова примерно так:

var express = require('express');
var router = express.Router();

router.post('/', function(req, res, next) {
    //console.log("pending data");

    console.log("0");

    var date = req.param('date');
    var joblist;
    var vehiclelist;

    console.log("1");

    res.locals.connection.query('SELECT * FROM job WHERE date = ?',[date] , function (error, results, fields) {
        console.log("2");
        if (error) throw error;
        joblist = JSON.stringify(results);

        console.log("3");

        res.locals.connection.query('SELECT * FROM vehicle ' , function (error, results, fields) {
            console.log("4");
            if (error) throw error;
            vehiclelist = JSON.stringify(results);

            console.log("5");

            // etc

            res.send('blah')
        });

    });

});

module.exports = router;

Современный JS теперь имеет обещания и async / await, которые обычно принимаются как более приятные замены для обратных вызовов в асинхронном коде: https://javascript.info/async-await

Быстрый фрагмент согласно последующему комментарию: (Это не полностью рабочий код, просто пример концепций)

var express = require('express');
var router = express.Router();

router.post('/', async function(req, res, next) {
    //console.log("pending data");

    console.log("0");

    var date = req.param('date');
    var joblist;
    var vehiclelist;

    console.log("1");

    var promises = [];
    promises.push(query1(date));
    promises.push(query2());

    var results = await Promise.all(promises);
    console.log(results[0]); // query1
    console.log(results[1]); // query2

    res.send('blah');
});

function query1(date) {
    return new Promise((resolve, reject) => {
        res.locals.connection.query('SELECT * FROM job WHERE date = ?',[date] , function (error, results, fields) {
            if (error) {
                reject(error);
            } else {
                resolve(results);
            }
        }
    })
}

function query2() {
    return new Promise((resolve, reject) => {
        res.locals.connection.query('SELECT * FROM vehicle ' , function (error, results, fields) {
            if (error) {
                reject(error);
            } else {
                resolve(results);
            }
        }
    })
}

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