gpt4 book ai didi

node.js - 使用 mongoose 和 Q.spread 给出数组回调参数

转载 作者:太空宇宙 更新时间:2023-11-03 22:17:10 24 4
gpt4 key购买 nike

我有以下代码:

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]

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

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

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

顺便问一下,推荐哪个区 block ?

最佳答案

保存回调签名为function(err, result, numberAffected),不符合 Node 回调约定。 nfcall 需要一个 Node 回调签名,即 function(err, result)。为了避免信息丢失,nfcall 返回的 Promise 解析为 [result, numberAffected]

在调用站点使用 .bindQ.nfcall 无论如何都非常难看,因此您可以创建一个方法来完成所有这些操作:

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

关于node.js - 使用 mongoose 和 Q.spread 给出数组回调参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23267676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com