1

我是 Node.js 的新手,并意识到它与客户端 javascript 的最大区别之一是一切都是异步的。

为了尝试解决这个问题,我尝试使用fibrous将我的代码转换为更具功能性的编程风格,但遇到了一些问题:

如何使以下纤维代码起作用?

例如,我希望下面的代码打印 1,2,3,但它打印 1,3,2

function test()
{
  var fibrous = require('fibrous');
  var fs = require('fs');

  fibrous.run(function() { 
    var data = fs.sync.readFile('/etc/passwd');
    console.log('2');
  });
}

function runTest()
{
  console.log('1');
  test();
  console.log('3');
}

runTest();

// This prints 1,3,2 to the console, not 1,2,3 as I'd like.

在一个真实的用例中,上面的例程将包装一个运行异步的 DB 方法,并使其如此我可以编写如下内容:

var dbTable = new dbTableWrapper();
var data = dbTable.getData();

/*
 ... do things with the data. 
 The "getData" routine is the same as my "test" function above.
*/
4

2 回答 2

3

使用 fibrous.run 调用本身运行(新添加的)“runTest”例程的答案是什么?

这是其中的一部分,是的。Fibrous 需要调用runTest自己才能管理其执行。

然后,test需要包装而不是.run()

var test = fibrous(function () {
    var data = fs.sync.readFile('/etc/passwd');
    console.log('2');
});

并且应该调用.sync()

test.sync();

var fibrous = require('fibrous');
var fs = require('fs');

var test = fibrous(function () {
  var data = fs.sync.readFile('/etc/passwd');
  console.log('2');
});

function runTest() {
  console.log('1');
  test.sync();
  console.log('3');
}

fibrous.run(runTest);
于 2013-09-09T14:50:11.783 回答
0

其他快递使用:

 var express = require('express');
 var router = express.Router();
 var fibrous = require('fibrous');

 router.use(fibrous.middleware);

 router.get('/sync', function(req, res, next) {

   var order_categories = Order_Category.sync.list(options);
   console.log("Order_Category count : " , order_categories.length);

   var content_tags = Content_Tag.sync.list(options);
   console.log("content_tags count : " , content_tags.length);

   var creatives = Creative.sync.list(options);
   console.log("creatives count : " , creatives.length);

   return res.send( {
      order_categories: order_categories,
      content_tags: content_tags,
      creatives: creatives
      }
   );

 });
于 2015-04-18T11:46:58.083 回答