好的,所以我的代码正在使用他们的官方API从yelp业务中提取数据。我的问题是,我似乎无法将数据从函数中返回。问题不在ejs中,而是数据在我告诉它时不会返回!我只是在一些尝试中没有定义,而对于其他尝试(包括我在这里将要展示的那个),我得到了一个空数组。我只粘贴重要的代码,如果您需要更多的话,请告诉我!
function yelp(){
var b = [];
var i = 0;
(struck the initialization of client)
client.business("(struck)", function(error, data) {
if (error != undefined){
res.send("an error occured. exiting");
process.process.reallyExit();
}
b[i++] = data.name;
b[i++] = data.display_phone;
b[i++] = data.rating;
console.log(b); //NEW!!
});
console.log(b);
return b;
}
app.get('/yelp', function(req,res){
var arr = yelp();
console.log(arr);
res.render('yelp.ejs', {title: 'Yelp!', arr: arr});
});
}
我又增加了一行代码,我认为这可能已经将问题缩小到与我糟糕的互联网连接有关。我添加了另一个console.log(b),这次是在business调用中添加的。console.log(arr)显示第二,console.log(b)显示;就在reutrn显示之前,最后是API调用中的console.log(B)。该日志也花了30秒时间才出现,并在页面加载后出现。那么,如何让页面等待数据呢?还是这和我的问题无关?
发布于 2015-03-23 16:14:01
nodejs是异步的,这意味着应用程序不会等待yelp()函数返回。您可以传递yelp函数,如下所示:
function yelp(callback){
var b = [];
var i = 0;
(struck the initialization of client)
client.business("(struck)", function(error, data) {
if (error != undefined){
res.send("an error occured. exiting");
process.process.reallyExit();
}
b[i++] = data.name;
b[i++] = data.display_phone;
b[i++] = data.rating;
});
console.log(b);
callback(b);
}
yelp(funtion(arr) {
res.render('yelp.ejs', {title: 'Yelp!', arr: arr});
})
发布于 2015-03-23 16:14:15
在不知道它们的API的情况下,我确实识别了回调样式。然后,调用客户端的结果将出现在回调中的data
参数中,而这正是您希望呈现视图的地方。
以下内容未进行测试。
function yelp(cb) {
var b = [];
var i = 0;
// (struck the initialization of client)
client.business("(struck)", function(error, data) {
if (error) {
return cb(error);
}
b[i++] = data.name;
b[i++] = data.display_phone;
b[i++] = data.rating;
});
console.log(b);
cb(null, b)
}
app.get('/yelp', function(req, res) {
yelp(function(err, arr) {
if (err) {
res.send("an error occured. exiting");
process.process.reallyExit();
return;
}
console.log(arr);
res.render('yelp.ejs', {
title: 'Yelp!',
arr: arr
});
});
});
这里要注意的是回调的传递。这通常是您在Node.js中进行异步工作的方式。使用承诺可以使它更漂亮一些。
发布于 2015-03-23 16:32:46
您预期会发生同步事件,但这是异步的。您的client.business
方法接受回调作为第二个参数,在调用res.render
时它不会返回。
试试这个:
function yelp(callback) {
var b = [];
var i = 0;
client.business("(struck)", function(error, data) {
if (error != undefined){
res.send("an error occured. exiting");
process.process.reallyExit();
}
b[i++] = data.name;
b[i++] = data.display_phone;
b[i++] = data.rating;
// No returns in async. Just call the callback.
callback('yelp.ejs', { {title: 'Yelp!', arr: b}})
});
}
app.get('/yelp', function(req,res){
yelp(res.render);
});
https://stackoverflow.com/questions/29215004
复制相似问题