大家好,我正在学习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。