3

我像下面这样包装我的每个路由器模块IndexBase.js
如果我想要一个像这样的模块othercrudmodule.js
并且这些函数也必须用 promise 执行,

我也尝试过使用coothercrudmodule.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;

其他crudmodule.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 然后返回同步结果。

4

0 回答 0