末日金字塔

我有这个路由代码到一个node.jsexpression式应用程序,我试图用q来使用承诺,而不是进入“callback地狱”。 我在上面包含了一个“服务层”,并且需要进行两个调用,并从两个函数返回一个带有数据的json结构。

 var express = require('express'); var q = require('q'); var service = require('./../model/service'); var router = express.Router(); router.get('/trips', function(req, res, next) { service.getAllTrips(function(err, trips) { if (err) throw err; service.getPeopleForTrips(function(err, people) { if (err) throw err; var json = { trips: trips, people: people }; return res.json(json); }); }); }); module.exports = router; 

我已经尝试将这两个服务调用分离成这个q例子在这里显示的内容,但是仍然无法使它工作或者如何构造这个例子。 我在这里先向您的帮助表示感谢。

这是我试过的:

 q.fcall(service.getAllTrips) .then(service.getPeopleForTrips) .then(function (data1, data2) { console.log(data1); console.log(data2); }) .catch(function (error) { console.log(error); }) .done(); 

您可以使用q.nfcall()作为以cb(err, result)格式进行callback的节点样式函数。 顺序forms:

 var trips; q.nfcall(service.getAllTrips) .then(function(data){ trips= data return q.nfcall(service.getPeopleForTrips) }) .then(function (people) { console.log(trips, people); }) .catch(function (error) { console.log(error); }) .done(); 

使用q.all你可以并行地运行promises数组,然后使用q.spread来传递返回的数组作为履行处理函数的参数:

 q.all([ q.nfcall(service.getAllTrips), q.nfcall(service.getPeopleForTrips) ]).spread(function(trips, people){ console.log(trips, people); }) .catch(function (error) { console.log(error); }) .done();