【问题标题】:how koa.js yield next works?koa.js yield next 是如何工作的?
【发布时间】:2015-06-03 17:52:56
【问题描述】:

我在 koa.js 中有以下代码

var koa = require('koa');
var app = koa();
var mysql = require('mysql');

app.use(function *(next) {
  console.log('A');
  yield next;
  console.log('E');
});

app.use(function *(next) {
  console.log('B');
  yield next;
  console.log('D');
});

app.use(function *(next) {
var rowCount;
  console.log('C');
  var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : 'pass',
    database : 'db1'
  });

  connection.connect();

  connection.query('SELECT * from itemcategory', function(err, rows, fields) {
    if (err) throw err;

    console.log('The solution is: ', rows);
    rowCount = rows;
    console.log('The rowCount is: ', rowCount);
  });


  this.body = "we are good!.." + rowCount ;
  connection.end();

});

app.listen(3000);

rowCount 变量在浏览器中打印 undefined。但在 connection.query 内部,它会打印所有行。 控制台中的输出也是

PS J:\proj\pg> node --harmony  .\app.js
A
B
C
D
E
The solution is:  [ { categoryno: 0, categoryname: 'PESTICIDES', categorystatus: 0 },
  { categoryno: 1, categoryname: 'SEEDS ', categorystatus: 0 },
  { categoryno: 2, categoryname: 'FERTILIZERS', categorystatus: 0 },
  { categoryno: 3, categoryname: 'OTHERS', categorystatus: 0 } ]
The rowCount is:  [ { categoryno: 0, categoryname: 'PESTICIDES', categorystatus: 0 },
  { categoryno: 1, categoryname: 'SEEDS ', categorystatus: 0 },
  { categoryno: 2, categoryname: 'FERTILIZERS', categorystatus: 0 },
  { categoryno: 3, categoryname: 'OTHERS', categorystatus: 0 } ]

根据 Koa 中的示例,它应该打印行,然后只打印 D 和 E,但 db 行在 D 和 E 之后打印。

如果删除 db 代码,则它会以正确的顺序打印。我带着和谐旗奔跑。

请告诉我是什么问题?

【问题讨论】:

    标签: javascript koa


    【解决方案1】:

    您使用回调异步运行查询,这不是您希望在 koa 中执行此操作的方式。

    您想使用一个支持 Promise 或 thunk 的库,或者您可以包装您使用的库,以便它返回一个 Promise 或 thunk。

    然后你会产生查询,它会暂停函数的执行,直到返回结果,然后函数从暂停的地方继续,查询结果可用。

    对于您的示例,您应该考虑以下库:

    我没用过,所以不能保证,但乍一看还算合理。

    https://github.com/sidorares/mysql-co

    这个库是对 mysql 库的一个包装器,它是可以产生的。

    所以你的代码应该是这样的:

    var koa = require('koa');
    var app = koa();
    var mysql = require('mysql-co');
    
    app.use(function *(next) {
      console.log('A');
      yield next;
      console.log('E');
    });
    
    app.use(function *(next) {
      console.log('B');
      yield next;
      console.log('D');
    });
    
    app.use(function *(next) {
    var rowCount;
      console.log('C');
      try{
        var connection = mysql.createConnection({
          host     : 'localhost',
          user     : 'root',
          password : 'pass',
          database : 'db1'
        });
    
        var result = yield connection.query('SELECT * from itemcategory');
        console.log(result);
    
        this.body = "we are good!.." + result.rows ;
        connection.end();
      }
      catch(err){
        // handle any errors here
      }
    });
    
    app.listen(3000);
    

    【讨论】:

      猜你喜欢
      • 2019-10-18
      • 2019-06-07
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      相关资源
      最近更新 更多