我试图避免厄运的金字塔。我的服务器上有一个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);
});
}