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

sails.js how to pass to view variables from multiple models

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

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
    });

有什么建议吗?

您需要使用像async, bluebird或nodejs原生Promise这样的promise方法或工具。

这很丑陋,但它会起作用。是的,您最好并行(并发)执行此操作,NPM 模块(例如异步)或使用(例如 Q.All)的承诺库可能会有所帮助。但是,如果您只是被困住并希望将其推出门外,只需将它们嵌套在一起即可。

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

// 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 - 形式为:

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

另一种方法是使用 Promises 库。 SailsJS 使用 BlueBird (since version 0.11.0), and earlier versions used Q.

Q.All 的形式为:

    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' ]
  });