Sails JS - вложенный метод.query не запускает последовательность

Я начинающий в Sails JS. Я пытаюсь сделать несколько.query("SELECT ... "). У меня есть проблема, когда выглядит, как это не запустить последовательность. Я объясню свою проблему, посмотрите на мой фрагмент кода:

var isSuccess = true;
for(var loc = 0 ; loc < decode.length ; loc++){
    Location.query('SELECT * FROM abc', function (err, res){
      if (err) {
        isSuccess = false;
        return res.json(200, {
          data: {

          },
          status: {
            id: 0,
            message: err.message
          }
        });
      } else {
        var validate = res.rows;
        sails.log(validate);

      secondQuery.query('SELECT * FROM def', function (err, seconResult) {
        if (err) {
          isSuccess = false;
          sails.log("Update is Success : "+isSuccess);
          return res.json(200, {
            data: {

            },
            status: {
              id: 0,
              message: err.message
            }
          });
        } else {


        }
      });
      }
    });

    if(isSuccess){
      return res.json(200, {
        data: {

        },
        status: {
          id: 1,
          message: "Successful",
          isSuccess: isSuccess
        }
      });
    }
  }

Когда я запрашиваю API через метод POST, и результат:

На сервере консольного узла JS:

Обновление прошло успешно: ложно. Это значит, что запрос не выполнен и должен быть возвращен статус = 0 в почтальоне

Но в Почтальоне это показывают:

  data: {

        },
        status: {
          id: 1,
          message: "Successful",
          isSuccess: true
        }

Мой вопрос:

Может кто-нибудь помочь мне объяснить, почему и как сделать это процессом последовательности, а не как "многопоточность"? (В моем случае мне нужно использовать запрос RAW, потому что я столкнусь с действительно сложным запросом)

Спасибо.

1 ответ

Решение

for цикл является синхронным, в то время как Location.query() метода нет. Так что если вы хотите сделать это по порядку, вам придется использовать Bluebird Promise,

Пример (не тестировался):

const Bluebird = require('bluebird');

const promises = [];
for(let loc = 0 ; loc < decode.length ; loc++) {
  promises.push(Location.query('SELECT ...'));
}

Bluebird.each(promises, (result) => res.json(200, {/* your payload data */}))
        .catch((err) => res.json(200, {/* your error data */}));

NB: будьте осторожны при использовании res переменная в ваших обратных вызовах, когда вы используете его в контроллерах Sails.

Другие вопросы по тегам