sails.js如何从多个模型传递到视图变量



大家好,我正在学习sails.js,有一个问题(这是我在控制器中的代码):

var test;
User.find().exec(function callBack(err,results){
                    //console.log(results);
                      test = results; //not working;
                    });
Reminder.find().exec(function callBack(err,reminders){
                    });

我想将两个查询的结果传递给我的视图:

return res.view('reminder/bla', 
    {
        users: users,
        reminders: reminders
    });

有什么建议吗?

这很难看,但它会起作用。是的,你最好同时做这件事;异步之类的NPM模块,或者使用(例如Q.All)的promise库,在这里可能会有所帮助。但是,如果你只是被卡住了,想把它拿出来,就把它们放在一起。

警告-这将一个接一个地执行。

// entry inside Controller method here..
var test;
User.find().exec(function callBack(err, users){
  Reminder.find().exec(function callBack(err, reminders){
    return res.view('reminder/bla',
      {
        users: users,
        reminders: reminders
      });
  });
});

同时执行上述操作的一种方法是使用异步.并行-形式为:

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);

另一种方法是使用Promises库。SailsJS使用BlueBird(自0.11.0版本起),早期版本使用Q.

Q.所有的形式都是:

    return Q.all([
        promise1,
        promise2
    ]).spread(function (resultFromPromise1, resultFromPromise2) {
      // do something with the results...
});

您可以简单地使用上面的方法之一来并行User.find()Reminder.find()函数调用,以便它们同时执行。

我没有打开您的代码示例/Sails实例,所以不会冒险在这个答案中编写特定的语法。然而,如果你试图使用上面的方法之一而陷入困境,那么请更新你的问题,我们很乐意看看。

每种方法的简单说明如下(仅使用演示的简单逻辑)

使用Async.js

var async = require('async');
var task = function (cb, count) {
  setTimeout(function () {
    cb(null, "complete: " + count);
  }, 1000);
};
async.parallel([
  function (cb) {
    task(cb, 'one');
  },
  function (cb) {
    task(cb, 'two');
  }
], function (err, results) {
  console.log(results);
  //[ 'complete: one', 'complete: two' ]
});

使用Q

var Q = require('q');
function task1(cb, count) {
  var deferred = Q.defer();
  setTimeout(function () {
    return deferred.resolve(cb(null, count));
  }, 1000);
  return deferred.promise;
}
var myCb = function (err, count) {
  return "complete: " + count;
};
Q.all([task1(myCb, 'one'), task1(myCb, 'two')])
  .then(function (results) {
    console.log(results);
    //[ 'complete: one', 'complete: two' ]
  });

您需要使用promise方法或工具,如async、bluebird或nodejs native promise。

相关内容

  • 没有找到相关文章

最新更新