0

組み立てが完了した後でパーシャルに渡すことができれば、翡翠のパーシャルにうまくレンダリングされるタイトな配列があります。(プリロードすることで確認しました)

私が今抱えている問題はどこにも答えが見つからないということです。アプリを実行すると、配列の組み立て/読み込みが完了するまで配列を使用または表示できません。(スクレイピングされたデータが入力されます)-だから私は配列を構築する関数を実行するために非同期を使用しています。よく働く。-すべてがビルドされたら、関数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

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()を変更して、2番目のパラメーター(コールバック)を受け入れる必要があります。これは、itemsオブジェクトで呼び出す必要があります。

于 2012-06-25T20:58:17.380 に答える
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 秒後にリロードせずに同じページに結果 (項目) を表示したいと考えています。ソケットまたは Ajax を使用せずに、これを達成する方法はありません。

データの準備が整うまで待つか、データが現在ロードされていることを示すページを表示してから切り替えることができます。

パーシャルはページ フラグメント、または html スニペットであり、so のように .jade に含める!=partial(template name[, options])か、so: のように Express から呼び出すことができますres.partial(template name[, options]);。これらはすべてサーバー上で行われます。

于 2012-06-24T21:57:43.740 に答える