我正在使用express框架处理node.js,我正在尝试调用多个mysql查询,每个查询都依赖于之前的查询。 如何同步执行查询。
function f1(id, cb) {
$sql = "SELECT * FROM s1 where process_id=" +id;
connection.query(
$sql,
function (err, result) {
if (err) {
cb(err, null);
} else {
var str = '';
if (result.length > 0) {
for(val in result) {
$sql = "SELECT attribute_name FROM s2 where id=" + result[val].id;
connection.query(
$sql,
function (err, attrresult) {
if (err) {
cb(err, null);
} else {
if (result.length > 0) {
str += attrresult[0].attribute_name;
}
}
}
);
}
}
cb('', str);
}
}
);
}
router.get('/', function(req, res, next) {
f1('27', function (err,respose) {
console.log(respose);
});
});
请建议。我们怎么能这样做。
提前致谢。
答案 0 :(得分:0)
你无法真正实现同步,但你可以通过使用promises和generator来使其看起来像同步代码。
function mySexyMethod() {
return new Promise(function (resolve, reject) {
someAsyncethod(params, function (err, data) {
if (err) {
return reject(err);
}
resolve(data);
})
});
}
Express router
var wrap = require('co-express');
router.verb('some-route', wrap(function* (req, res, next) {
var val, val2;
try {
val = yield mySexyMethod();
val2 = yield anotherPromiseThatRequiresPreviousVal(val);
} catch (e) {
return next(e);
}
});
更好的是,查看https://www.npmjs.com/package/bluebird并检查您使用的mysql lib是否可以被宣传。
答案 1 :(得分:0)
您可以使用promise chaining或async包来逐步处理系列执行 查看以下指南以进行承诺链接 https://coderwall.com/p/ijy61g/promise-chains-with-node-js
用于异步检查以下包 https://github.com/caolan/async
答案 2 :(得分:0)
根据定义,节点I / O是异步的。我认为你的问题是for循环。它在匹配每变量嵌套查询回调之前循环所有迭代。因此,使用某种机制来实现所需的执行流程。你可以使用promises,有几个好的库(Q,Bluebird,ES2015的原生承诺......)你也可以使用async.js更容易处理它。
libs不是强制性的,但它们可以更轻松地完成工作。
答案 3 :(得分:0)