从Nodejs中的函数返回数组并将其发送到ejs视图?

时间:2015-03-23 16:09:31

标签: javascript node.js express

好的,所以我的代码是使用官方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秒才能显示,并且在页面加载后显示。那么,我该如何让页面等待数据呢?或者这与我的问题无关?

3 个答案:

答案 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);
});