我是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
}
});
}
}
当我通过POST方法请求API时,结果是:
在控制台节点JS服务器上:
更新成功:false 所以这意味着请求失败,并且邮递员必须返回状态= 0
但在邮递员中,它显示:
data: {
},
status: {
id: 1,
message: "Successful",
isSuccess: true
}
我的问题:
任何人都可以帮我解释为什么以及如何使它成为一个序列过程,而不是像“多线程”? (在我的情况下,我需要使用RAW查询,因为我将面对非常复杂的查询)
谢谢。
答案 0 :(得分: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 */}));
注意:在Sails控制器中使用{/ 1}}变量时,请小心使用res
变量。