需要具有承诺功能的模块

时间:2015-11-18 10:51:51

标签: javascript node.js promise ecmascript-6 co

我将每个路由器模块包裹在下面IndexBase.js
如果我想要一个像othercrudmodule.js这样的模块, 并且这些函数也必须以承诺执行,

我尝试在co中使用othercrudmodule.js,但我知道绝对没有工作

如何正确地构建它?

IndexBase.js

  var co = require('co');
  var othercrudmodule = require('../../CustomModules/othercrudmodule');

  router.get('/q', function(req, res, next) {
    domain.run(function() {
      var dbClient = req.app.get('dbClient');
      // some promise crud database function ..
      // ..

      co(function *() {
        // yield promise crud database function


        // **should I use yield here too? or ?   
        // How to get sync result here with selectAll**
        var othercrudmoduleResult = yield othercrudmodule(dbClient).selectAll();

        // render result
      }).catch(onerror);
      function onerror(error) { 
        console.error(error.stack);
        res.send(error.stack);
      }
    });
    domain.on('error', function(error) { 
      console.error(error.stack); 
      res.send();
    });
  });

  module.exports = router;

othercrudmodule.js

var co = require('co');

var othercrudmodule = function(dbClient) {
  // some promise crud database function ..
  var selectArticle = function() {
    return new Promise(function (fulfill, reject){
      var domainB = require('domain').create();
      domainB.on('error', function(error) { domain.emit('error', error); });
      domainB.run(function() {
        var query = 'SELECT * FROM "Tag0" ORDER BY "Name"';
        dbClient.Article.query(query,[], function(error, result) {
          var o = {};
          if (error != null) {
            o.error = error;
            fulfill(o);
          } else {
            o.result = result;
            fulfill(o);
          }
        });
      });
    });
  };

  // ... more promise crud database function ..


  var selectAll = function() {
    // **should I use co and yield in this module ??  I want selectAll return sync result**

    // co(function *() {
      // .... yield promise crud database function ??

      var o = [];
      var selectArticleResult = selectArticle();
      // console.log(selectArticle1Tag0Result);
      o.push(selectArticleResult.result.rows);


      return o;
    // }).catch(onerror);
    // function onerror(error) { 
    //   console.error(error.stack);
    //   res.send(error.stack);
    // }
  };

  var o = {};
  o.selectAll = selectAll;
  return o;
};


module.exports = othercrudmodule;

更新
selectAll函数没有承诺,所以我得到异步结果?那怎么解决呢? 现在我使用yield othercrudmodule(dbClient).selectArticle()获取正确的同步结果,但那不是我想要的......

我想使用othercrudmodule(dbClient).selectAll(),模块中的函数用数据库函数执行一些crud然后返回同步结果。

0 个答案:

没有答案