Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 末日金字塔_Javascript_Node.js_Express_Q - Fatal编程技术网

Javascript 末日金字塔

Javascript 末日金字塔,javascript,node.js,express,q,Javascript,Node.js,Express,Q,我有一个node.js express应用程序的路由代码,我试图使用q来使用承诺,而不是进入“回调地狱”。我在上面包含了一个“服务层”,需要进行两次调用,并返回一个json结构,其中包含来自这两个函数的数据 var express = require('express'); var q = require('q'); var service = require('./../model/service'); var router = express.Router(); router.get('/

我有一个node.js express应用程序的路由代码,我试图使用
q
来使用承诺,而不是进入“回调地狱”。我在上面包含了一个“服务层”,需要进行两次调用,并返回一个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();
您可以使用for节点样式的函数,它以
cb(err,result)
格式接受回调。顺序形式:

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
可以并行运行承诺数组,然后使用将返回的数组作为履行处理程序的参数进行传播:

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();

粘贴你的代码,这样我们就可以看到你想做什么do@tmcgoo用我尝试过的
q
@tmcgoo进行编辑,而不是
fcall
make
nfcall