首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Nodejs中的函数返回数组并将其发送到ejs视图?

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

Stack Overflow用户
提问于 2015-03-23 16:09:31
回答 3查看 856关注 0票数 0

好的,所以我的代码正在使用他们的官方API从yelp业务中提取数据。我的问题是,我似乎无法将数据从函数中返回。问题不在ejs中,而是数据在我告诉它时不会返回!我只是在一些尝试中没有定义,而对于其他尝试(包括我在这里将要展示的那个),我得到了一个空数组。我只粘贴重要的代码,如果您需要更多的话,请告诉我!

代码语言:javascript
运行
复制
 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秒时间才出现,并在页面加载后出现。那么,如何让页面等待数据呢?还是这和我的问题无关?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-23 16:14:01

nodejs是异步的,这意味着应用程序不会等待yelp()函数返回。您可以传递yelp函数,如下所示:

代码语言:javascript
运行
复制
 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});   
})
票数 0
EN

Stack Overflow用户

发布于 2015-03-23 16:14:15

在不知道它们的API的情况下,我确实识别了回调样式。然后,调用客户端的结果将出现在回调中的data参数中,而这正是您希望呈现视图的地方。

以下内容未进行测试。

代码语言:javascript
运行
复制
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中进行异步工作的方式。使用承诺可以使它更漂亮一些。

票数 1
EN

Stack Overflow用户

发布于 2015-03-23 16:32:46

您预期会发生同步事件,但这是异步的。您的client.business方法接受回调作为第二个参数,在调用res.render时它不会返回。

试试这个:

代码语言:javascript
运行
复制
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);
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29215004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档