nodejs + mysql + Q解决方案的替代实现?

时间:2015-12-01 22:12:10

标签: javascript node.js promise q node-mysql

我试图避免厄运的金字塔。我的服务器上有一个REST函数,它返回一个“payload”对象,其中包含三个用于结果的JSON字段。使用mysql查询调用计算三个字段中的每一个。我想出了nodejs将下一个查询放在当前查询的回调函数中的方法,但是厄运金字塔在招手!

我使用Q promises找到了这个解决方案很棒,但我无法从Q文档中找出deferred和.makeNodeResolver的工作原理。结果对象也是令人生畏的,我不得不通过反复试验找到我的结果......有没有其他方法可以解决这个问题?我是否让它变得更难?

Stack Overflow answer with helpful but confusing Q syntax (programath's answer)

我的代码:

    var queryHelper = function(request, response, payload)
    {
      var queryQB = queryConstructionHelper(request, '"QB"')
      var queryRB = queryConstructionHelper(request, '"RB"')
      var queryWRTE = queryConstructionHelper(request, '"WRTE"')

      function doQuery1()
      {
        var deferred = Q.defer();
        database.query (queryQB, deferred.makeNodeResolver());
        return deferred.promise;
      }
      function doQuery2()
      {
        var deferred = Q.defer();
        database.query (queryRB, deferred.makeNodeResolver());
        return deferred.promise;
      }
      function doQuery3()
      {
        var deferred = Q.defer();
        database.query (queryWRTE, deferred.makeNodeResolver());
        return deferred.promise;
      }

      Q.all([doQuery1(),doQuery2(),doQuery3()]).then(function(results)
      {
           payLoadAssignHelper('"QB"', payload, results[0][0][0].payloadCount);
           payLoadAssignHelper('"RB"', payload, results[1][0][0].payloadCount);
           payLoadAssignHelper('"WRTE"', payload, results[2][0][0].payloadCount);

          response.send(payload);
      });
    }

0 个答案:

没有答案