简单的蓝鸟示例与restify不起作用

时间:2015-10-19 20:28:33

标签: promise bluebird

直接从this post

此代码永远不会执行。

 events: {
            load: function () {
                var chart = this,
                    legend = chart.legend;

                for (var i = 0, len = legend.allItems.length; i < len; i++) {
                    (function(i) {
                        var item = legend.allItems[i].legendItem;
                        item.on('mouseover', function (e) {
                            //show custom tooltip here
                            console.log("mouseover" + i);
                        }).on('mouseout', function (e) {
                            //hide tooltip
                            console.log("mouseout" + i);
                        });
                    })(i);
                }

            }
        }

我只把这个简单的例子放在一起,在我的生产代码没有用之后向我自己证明。我可以用curl命中localhost:7070,我得到了预期的结果。

简而言之:我需要在创建POST之前对服务器执行3次GET调用,因此我需要承诺。

任何人都可以获得一些见解?我无法想象这会更简单。

1 个答案:

答案 0 :(得分:0)

<强>更新

显然我没有正确地阅读这个问题,这里有一个使用promisified restify json客户端的2个工作示例。你只需要为你的帖子在第二个传播体内做另一个传播。

var promise = require('bluebird');
var restify = require('restify');
promise.promisifyAll(restify.JsonClient.prototype);
var client = restify.createJsonClient({
    url: 'http://localhost:8080',
    version: '*'
});


client.getAsync('/api/resource/1').spread(function(req, res, obj) {
    console.log('result 1', obj);

    return client.getAsync('/api/resource/2').spread(function(req, res, obj) {
        console.log('result 2', obj);
    });
});

正如我在评论中所说的那样,我不会擅自改善自己。相反,我会使用一个处理器,它的主体执行promise代码或一系列处理程序(也可以在正文中有promises)。 restify应该只接收请求并执行处理程序。

我将使用restify页面中基本示例的修改版本来说明每个。

使用返回承诺的knex.js在邮件正文中做出承诺

var knex = require('knex')(connectionConfig);
var restify = require('restify');

function promisePost(req, res, next) {
    // get 1
    knex.select('*')
    .from('table1')
    .where('id', '=', req.body.table1_id)
    .then(function(result1) {
        // get 2
        return knex.select('*')
        .from('table2')
        .where('id', '=', req.body.table2_id)
        .then(function(result2) {
            return knex('table3').insert({
                table1_value: result1.value,
                table2_value: result2.value
            })
            .then(function(result3) {
                res.send(result3);
                return next();
            });
        });
    });
}

var server = restify.createServer();
server.use(restify.bodyParser());
server.post('/myroute', promisePost);

server.listen(8080, function() {
  console.log('%s listening at %s', server.name, server.url);
});

现在使用链式处理程序

var knex = require('knex')(connectionConfig);
var restify = require('restify');

function get1(req, res, next) {
    knex.select('*').from('table1')
    .where('id', '=', req.body.table1_id)
    .then(function(result1) {
        res.locals.result1 = result1;
        return next();
    });
}
function get2(req, res, next) {
    knex.select('*').from('table2')
    .where('id', '=', req.body.table2_id)
    .then(function(result2) {
        res.locals.result2 = result2;
        return next();
    });
}

function post(req, res, next) {
    knex('table3').insert({
        table1_value: res.locals.result1,
        table2_value: res.locals.result2
    })
    .then(function(result3) {
        res.send(result3);
        return next();
    });
}

var server = restify.createServer();
server.use(restify.bodyParser());
server.post('/myroute', get1, get2, post);

server.listen(8080, function() {
  console.log('%s listening at %s', server.name, server.url);
});