例如,红宝石:
con = Mysql.new('localhost')
rs1 = con.query('select * from test01') # A
rs2 = con.query('select * from test02') # B
rs = getResult(rs1, rs2) # C
con.close 因此,A将阻止执行。B将被执行,直到A完成为止。C也是
例如,nodejs
var mysql = require('mysql');
var connection = mysql.createConnection({host : 'localhost',});
connection.connect();
connection.query('SELECT * from test01', function(err, rows, fields) {
console.log(rows);
}); // A
connection.query('SELECT * from test02', function(err, rows, fields) {
console.log(rows);
}); // B
connection.end();A不会阻止B,但是通常代码应该如下所示:
connection.query('SELECT * from test01', function(err, rows1, fields) { // A
connection.query('SELECT * from test02', function(err, rows2, fields) { // B
getResult(rows1, rows2); // C
});
});或者用承诺来并行执行
Promise.all([
connection.query('SELECT * from test01'),
connection.query('SELECT * from test02'),])
.then(function(data) {
getResult(data[0], data[1])
})我的问题是,一定要这样吗?是否可以通过编写同步代码而获得异步效果?
例如,languageX:
VAR con = Mysql=>new('localhost') # A
VAR rs1 = con=>query('select * from test01') # B
VAR rs2 = con=>query('select * from test02') # C
VAR rs = getResult(rs1, rs2) # D
con=>close # E程序是:
我在这里想说的是,没有乱七八糟的回调,而是干净的、简单的、简单的代码,我们可以获得非阻塞IO。
发布于 2017-05-15 09:46:52
我的问题是,一定要这样吗?是否可以通过编写同步代码而获得异步效果?
是。您可以在节点7+上使用异步/等待,也可以在较早版本的节点上使用基于生成器的协同。
它看起来会像:
var x = await f1();
var y = await f2(x);
// ...甚至:
var y = await f2(await f1());
// ...但它仍将是异步和非阻塞的。您可以在任何返回承诺的函数中使用这种语法--就像Node中的许多数据库驱动程序和ORMs/ODM一样。
关于更多的例子,请参见这些答案:
https://stackoverflow.com/questions/43973850
复制相似问题