使用mongoose和Q.spread给出数组callback参数

我有下面的代码:

var mongoose = require('mongoose'); var Q = require("q") mongoose.connect("mongodb://localhost/testdb"); var Schema = mongoose.Schema; var employeeSchema = new Schema({ name:String }) var Employee = mongoose.model('Employee', employeeSchema); var departmentSchema = new Schema({ name:String }) var Department = mongoose.model('Department', departmentSchema); var employee = new Employee(); employee.name = "T.Smith"; var dept = new Department(); dept.name = "Sales"; Q.spread([ Q.nfcall(employee.save.bind(employee)), Q.nfcall(dept.save.bind(dept)) ],function(emp,dept){ console.log(JSON.stringify(emp)); console.log(JSON.stringify(dept)); mongoose.disconnect(); }) 

日志语句将产生以下结果:

[{“__v”:0,“name”:“T.Smith”,“_ id”:“5358f3c53cd354bc70fe619f”},1] [{“__v”:0,“name”:“Sales”,“_ id” 5358f3c53cd354bc70fe61a0" },1]

为什么结果是数组而不是单个对象?

如果我用这个块代替最后一块代码,我会得到相同的结果:

 Q.all([ Q.nfcall(employee.save.bind(employee)), Q.nfcall(dept.save.bind(dept)) ]).spread(function(emp,dept){ console.log(JSON.stringify(emp)); console.log(JSON.stringify(dept)); mongoose.disconnect(); }) 

顺便说一下,哪个块是推荐的?

savecallback签名是不符合节点callback约定的function(err, result, numberAffected)nfcall需要一个节点callback签名,这是function(err, result) 。 为避免信息丢失, nfcall返回的nfcallparsing为[result, numberAffected]

在呼叫站点使用.bindQ.nfcall是非常丑陋的,所以你可以创build一个方法来完成这一切:

 mongoose.Model.prototype.saveForResult = function() { return Q.nbind(this.save, this)().spread(function(result, numberAffected) { return result; }); }; 

然后:

 Q.spread([ employee.saveForResult(), dept.saveForResult() ],function(emp,dept){ console.log(JSON.stringify(emp)); console.log(JSON.stringify(dept)); mongoose.disconnect(); })