0

我有一个很好的紧密阵列,如果我只能在完成组装后将它传递给部分,它会很好地渲染成玉部分。(我已经通过预加载确认了它)

我现在遇到的问题并且在任何地方都找不到答案是,当我运行我的应用程序时,我无法使用或显示数组,直到它自己完成组装/加载......(它被填充了抓取的数据) - 所以我'正在使用 async 来运行构建数组的函数。效果很好。- 然后我在整个构建完成后调用一个函数 done() 我确认它确实构建了 - 现在我只想将数组传递给我的部分但似乎我不能这样做除非使用 Ajax + JSON :( 我试图避免这种情况,因为部分已经内置了可靠的迭代。

- 有没有人知道在应用程序已经运行(不使用套接字)后填充部分的简单方法?

//in my main app, web.js
//assume I have all the dependencies loaded
//setup an empty array
var items = new Array();

// then run 'fetch' which populates array with scraped data, takes about 10 seconds 
app.get('/', function(req, res){
    fetch(p.u[0]);  //builds the array, returns items[] 
    res.render('index.jade', {
        title: 'my first node.js app',
        item: 'items' //what the partial needs, this throws an error if I don't 
    })
});

//have to use this to avoid initial error due to array being empty/undefined when app
//first starts 
var params = {
    "namespace": {
        "items": [
            "an unnecessary value"
        ]
    }
};

//and finally this is what's called once the array is finished assembling itself
function displayItems(){
    app.get('/', function(req, res){
      req.render('items.jade', {item : 'items'})
    })  
}



//index.jade
//setup my partial
//script is there to avoid initial error due to array being empty/undefined when app
//first starts
div.list
  script
    if(namespace.items) {
      if(namespace.items.length) {
        != partial('item', items)
      }
    }


//and my partial, _items.jade
//express docs confirm that jade would iterate over each item in the items array 
//with this jade markup
ul.list
  li.date #{item.date}
  li.descrip #{item.descrip}
  li.reas #{item.reas}
  li.cmpny #{item.cmpny}
  li.photo #{item.photo}
4

2 回答 2

0

已经晚了,我不完全确定我理解你的问题,但如果你愿意等待 10 秒一次,你可以这样做并缓存结果:

var items = null;

app.get('/', function(req, res){
    function done(){
       res.render('index.jade', {
          title: 'my first node.js app',
          item: items
       }):
    }
    if( items == null ){
       return fetch(p.u[0], function(err,fetchedItems){
          if( err ) throw err;
          items = fetchedItems;
          return done();
       });
    }
    return done();
});

希望这可以帮助。

也可能不是:您在服务器端使用jade 来组装页面,然后再通过网络发送它们。

如果我理解正确,您想向用户显示一个页面,并在 10 秒后在同一页面上显示结果(项目)而不重​​新加载。如果不使用 Sockets 或 Ajax,我就无法做到这一点。

您可以等到数据准备好,或者显示一个页面,说数据当前正在加载,然后将其关闭。

partials 是页面片段或 html 片段,可以像这样包含在 .jade 中,也可以像这样!=partial(template name[, options])从 express 中调用res.partial(template name[, options]);:所有这些都发生在服务器上。

于 2012-06-24T21:57:43.740 回答
0

如果您尝试同步执行此操作,那么您将挫败 node.js 和 Express 背后的整个想法。如果您的应用程序正在等待生成此数组的查询/脚本,那么接下来的 http 请求会发生什么?您应该重组您的应用程序以利用节点的异步方法并将渲染作为回调传递:

app.get('/', function(req, res){
    var renderView = function(items) {
        return res.render('index.jade', {
            title: 'my first node.js app',
            item: items
        })
    };

    fetch(p.u[0], renderView);
});

而且您必须修改 fetch() 以接受第二个参数(回调),您必须使用 items 对象调用它。

于 2012-06-25T20:58:17.380 回答