使用Sails使用多个unirest请求

时间:2014-04-25 23:54:02

标签: javascript node.js sails.js

我有以下代码

index: function (req, res) {

  var Request = unirest.get("https://poker.p.mashape.com/index.php?players=4").headers({ "X-Mashape-Authorization": "xxxxxxxxxxxxxxxxx" }).end(function (response) {
    players = response.body;

    showdown_total = players.showdown.length;
    showdown = Array();


  });
  console.log(players);

  // Send a JSON response
  res.view({
    hello: 'world',
    //players: players
  });

},

如果我在获取中添加 res.view ,效果会非常好,但我想将这些变量发送到视图并且能够添加另一个不正确的请求

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

这就是asynchronous code在Node.js中的工作方式。

基本上,当操作不评估ASAP时,节点不会等待它。它只是说,“很好,不用担心,只要告诉我你什么时候完成” ..等等。

问题是,在您的代码中,您不会在获取请求时告诉节点。已经完成了。在请求函数开始考虑获取数据之前,您只需将视图发送到客户端。

如何让节点等待?

你有一些选择。或者,给它一个回调函数(完成后执行此操作),或者必须嵌套函数。这两者真的是一样的。

我将向您展示一个解决方案嵌套函数

var urlOne = "https://poker.p.mashape.com/index.php?players=4",
    urlTwo = "http://some.other.url",
    headers = { "X-Mashape-Authorization": "xxxxxxxxxxxxxxxxx" };

// Run first request
unirest.get(urlOne).headers(headers).end(function (response) {
    players = response.body;
    showdown_total = players.showdown.length;
    showdown = Array();

    // Run second request
    unirest.get(urlTwo).headers(headers).end(function (response) {
        someVar = response.body;

        // Show all my data to the client
        res.view({
            players: players,
            someOther: someVar
        });
    });
});

其他解决方案:

  • 如果您不想嵌套这些功能,请在完成后运行回调
  • 使用模块处理异步代码,例如one of the more popular ones名为 Async

我建议你在直接跳转到外部库之前阅读有关回调,异步代码和nodejs的更多信息。

答案 1 :(得分:0)

还有另一种方法......你可以使用纤维!

阅读一些文档here!

var sync = require('synchronize');

index: function (req, res) {
    sync.fiber(function(){

        var response = sync.await(
            unirest.get("https://poker.p.mashape.com/index.php?players=4").headers(
                { "X-Mashape-Authorization": "xxxxxxxxxxxxxxxxx" }
            ).end(sync.defer())
        );

        var players = response.body;
        console.log(players);

        // Send a JSON response
        res.view({
            hello: 'world',
            players: players
        });
    });
}