我有以下代码
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 ,效果会非常好,但我想将这些变量发送到视图并且能够添加另一个不正确的请求
感谢您的帮助
答案 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
});
});
});
其他解决方案:
我建议你在直接跳转到外部库之前阅读有关回调,异步代码和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
});
});
}