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.