2016-05-30 3 views
1

私はthis質問がほぼ同じタイトルを持っているが、問題は異なっていることを知っています。翡翠のテンプレートがデータを受け取りません

最新のKeystone.jsリリースに組み込まれているJadeテンプレートエンジンv.1.11.0を使用しています。コントローラでは、2つのview.on( 'init')コールバックを使用してデータを照会します。最初のコールバックは1つのレコードのみを照会し、常に通過します。二番目は時々そうしない。私の見解では

var keystone = require('keystone'); 
var async = require('async'); 
exports = module.exports = function (req, res) { 

    var view = new keystone.View(req, res); 
    var locals = res.locals; 

    // Init locals 
    locals.section = 'category'; 
    locals.filters = { 
     category: req.params.category 
    }; 
    locals.data = { 
     sections: [], 
     category: {} 
    }; 

    // Load current category 
    view.on('init', function (next) { 

     var q = keystone.list('Category').model.findOne({ 
      key: locals.filters.category 
     }); 

     q.exec(function (err, result) { 
      locals.data.category = result; 
      locals.section = locals.data.category.name.toLowerCase(); 
      next(err); 
     }); 
    }); 


    // Load sections 
    view.on('init', function (next) { 
     var q = keystone.list('Section').model.find().where('category').in([locals.data.category]).sort('sortOrder').exec(function(err, results) { 

      if (err || !results.length) { 
       return next(err); 
      } 

      async.each(results, function(section, next) { 
       keystone.list('Article').model.find().where('section').in([section.id]).sort('sortOrder').exec(function(err, articles){ 
        var s = section; 
        if (articles.length) { 
         s.articles = articles; 
         locals.data.sections.push(s); 
        } else { 
         locals.data.sections.push(s); 
        } 
       });    

      }, function(err) { 
       console.log(locals.data.sections); 
      }); 

      next(err); 
     }); 
    }); 

    view.render('category'); 
}; 

category.jsは、私はいつもこれが渡される必要があります。

sections: 

category: { _id: 574b8960947f45f034ac89b4, key: 'johndoe', sortOrder: 1, name: 'JohnDoe', __v: 0, image: {} } 

sections: { _id: 574b909b43ff68163ed86bf2, publicTitle: 'Title 1', key: 'name-1', sortOrder: 3, name: 'Name 1', __v: 0, category: 574b8960947f45f034ac89b4, text: '', image: {} } 

category: { _id: 574b8960947f45f034ac89b4, key: 'blabla', sortOrder: 1, name: 'Blabla', __v: 0, image: {} } 

しかし、時間の60%を、私はこれを取得

奇妙なことですが、別のカテゴリに行くとより多くセクションと30の記事のように、私はセクションの90%を取得しますが、まだそれらを10%を逃しています。これは開発と生産の両面で持続します。

next()」の再生が早すぎますか?私はどこが乱れたのか分かりません。

+0

1つのinitでクエリをネストしようとしてください。 – Darren

+0

私は最初からやってみましたが、何らかの理由でページを永久にロードしてしまいました。また、2つのinitsを持つことは問題ではないようですが、このアプローチは、定型文でさえ、台形に広く使われています。 –

+0

私はまた、次の(エラー)に移動するように勧められました。非同期コールバックでは、永久に読み込みが行われます。 –

答えて

0

いいえ。 asyncの読書のあと、async.parallelを使って正しく動作させることができました。

var keystone = require('keystone'); 
var async = require('async'); 
exports = module.exports = function (req, res) { 

    var view = new keystone.View(req, res); 
    var locals = res.locals; 

    // Init locals 
    locals.section = 'category'; 
    locals.filters = { 
     category: req.params.category 
    }; 
    locals.data = { 
     sections: [], 
     category: {} 
    }; 

    // Load current category 
    view.on('init', function (next) { 

     var q = keystone.list('Category').model.findOne({ 
      key: locals.filters.category 
     }); 

     q.exec(function (err, result) { 
      locals.data.category = result; 
      locals.section = locals.data.category.name.toLowerCase(); 
      getChildrenRecords(locals.data.category, next); 
     }); 
    }); 


    function getChildrenRecords(category, next){ 

     var q = keystone.list('Section').model.find().where('category').in([category]).sort('sortOrder').exec(function(err, results) { 

      if (err || !results.length) { 
       return next(err); 
      } 

      callItems = []; 

      for(var i = 0; i < results.length; i++) { 
       var data = results[i]; 
       callItems.push(makeCallbackFunction(data)); 
      } 

      function makeCallbackFunction(section) { 
       return function (callback) { 

        keystone.list('Article').model.find().where('section').in([section.id]).sort('sortOrder').exec(function(err, articles){ 

         if (err) return callback(err); 

         if (articles.length) { section.articles = articles; } 
          locals.data.sections.push(section); 
          callback(); 
        }); 
       }; 
      } 

      async.parallel(callItems, function(err, results){ 
       next(err); 
      }); 
     }); 
    } 


    // Render the view 
    view.render('category'); 
};