好的,所以我的代码是使用官方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});
});
}
我添加了一行代码,我认为可能已经将问题缩小到与我糟糕的互联网连接有关。我在业务API调用中添加了ANOTHER console.log(b)。 console.log(arr)显示第二个,console.log(b);就在reutrn首先显示之前,LAST是console.log(b)INSIDE API调用。该日志也需要30秒才能显示,并且在页面加载后显示。那么,我该如何让页面等待数据呢?或者这与我的问题无关?
答案 0 :(得分:1)
在不知道他们的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中的异步工作使用promises可以使它更漂亮。
答案 1 :(得分:0)
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});
})
答案 2 :(得分:0)
您希望同步事情发生,但它是异步的。你的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);
});