我正在努力让我的mongoose模型使用Q promises保存异步。 当我使用Q.nfcall或使用Q.defer()连接时,我看到传递给我的promise的结果对象的行为有所不同
值得注意的是,当使用Q.defer()时,我能够访问结果对象的所有属性,就像使用本机回调函数一样。 但是,使用Q.nfcall时,所有属性都是未定义的。 更令人费解的是,记录两个对象,我可以看到整个json字符串打印出来。
这是代码(在coffeescript中)
Customer = new models.Customer({name: 'John Doe'})
console.log 'Customer.id' + Customer.id
deferred = Q.defer()
Customer.save((error, value) ->
deferred.resolve(value)
)
deferred.promise.then((customer) ->
console.log 'Deferred::customer.id: ' + customer.id
console.log 'Deferred::customer.name: ' + customer.name
console.log 'Deferred::customer: ' + customer)
Q.nfcall(Customer.save.bind(Customer)).then((customer) ->
console.log 'Qnfcall::customer.id: ' + customer.id
console.log 'Qnfcall::customer.name: ' + customer.name
console.log 'Deferred::customer: ' + customer)
这是输出
Qnfcall::customer.id: undefined
Qnfcall::customer.name: undefined
Qnfcall::customer: { __v: 0, name: 'John Doe', _id: 54461d5523867cc087ef4374 },0
Deferred::customer.id: 54461d5523867cc087ef4374
Deferred::customer.name: John Doe
Deferred::customer: { __v: 0, name: 'John Doe', _id: 54461d5523867cc087ef4374 }
我不知道我在这里做错了什么。任何帮助非常感谢!!
答案 0 :(得分:0)
从Mongoose docs开始,Model#save
的回调有三个参数:错误,保存的对象和更新的行数:
回调将收到三个参数,错误是发生错误,product是保存的产品,numberAffected是在数据库中找到并更新文档时为1,否则为0。
Q.nfcall
检测回调的第三个参数,并使用数组[savedObject, numberAffected]
解析承诺,这样就不会丢失numberAffected
。见Q docs:
请注意,如果Node.js样式的API使用多个非错误参数(例如child_process.execFile)回调,则Q会在执行转换时将这些参数作为promise的履行值打包到数组中。
在CoffeeScript中,您可以使用destructuring参数来解压缩此数组:
Q.nfcall(Customer.save.bind(Customer)).then ([customer, rowsAffected]) ->
console.log 'Qnfcall::customer.id: ' + customer.id
console.log 'Qnfcall::customer.name: ' + customer.name
console.log 'Qnfcall::customer: ' + customer
console.log 'Qnfcall::rowsAffected: ' + rowsAffected