控制复杂的流节点

时间:2014-01-13 08:11:03

标签: node.js

我想使用像async这样的库来控制NodeJS中的流程。我检查了异步,它有系列,平行,瀑布,它们不适合。瀑布似乎很好,但还不够。我的代码就像:

checkInMemcache(resultl, function(
 {
   if(!result) {
     checkInMongo(result2, function(
      {
        if(result2) {
         checkOther(result3, function() {
           if else ..
         })
        } else {
         .. do something
        }
      }
     ) 
   } else {
     .. do something
   }
 }
)

2 个答案:

答案 0 :(得分:0)

看看那些不错的控制流模式。抓住它们将允许您在开始时没有任何libs来处理简单的并发/异步问题:

检查一下:http://book.mixu.net/node/ch7.html

另一个值得检查的好读物是:

http://trevorburnham.com/presentations/flow-control-with-promises/#/

以下是其他Promise / A规范实施的列表:

<强> JQuery的

<强>承诺/ A +

答案 1 :(得分:0)

我使用nimble。我会创建一个检查功能列表。每个检查功能都会检查某个存储(检查可以是同步还是异步),只有在找不到值时才会继续执行下一个功能。否则函数执行给定的回调并继续下一步。

var flow = require('nimble');

flow.series([
  function checkInMemcache(callback) {
    // get memResult
    if (memResult) { // result found
      onResult(result);
    } else { // continue with the next step
      callback();
    }
  },
  function checkInMongo(callback) {
    // check in MongoDB, like
    mongo.asyncCheck(function(result) {
      if (result) { // result found
        onResult(result);
      } else { // continue with the next step
        callback();
      }
    });
  },
  function checkOther(callback) {
    // perform other checks
  }
]);

function onResult(result) {
  // do something
}

这种控制流的优点是它避免了回调嵌套。通过创建检查函数数组并实现next()方法,shift()下一个函数从数组中执行并执行它,也可以在没有任何模块的情况下实现类似的控制流。如果该函数有结果,则执行onResult()。否则它再次调用next(),依此类推,直到数组变空。

Nimble模块非常小,它允许以这种方式执行串行,并行和混合流。