我想简化这个方法:
var Q = require('q');
module.exports.save = function (db, item) {
return Q.promise(function (resolve, reject) {
db.items.save(item, function (e, result) {
if (e) {
reject(e);
} else if (result) {
resolve(result);
} else {
reject('object expected');
}
});
});
};
它运行良好,promise从数据库中返回了一个对象。
我用代替了它
module.exports.save = function (db, item) {
return Q.ninvoke(db.items, 'save', item);
};
它也可以很好地工作,但使用具有单个元素的数组进行解析,并且该元素与原始代码中的元素相同。
它为什么要这么做?如何使其不将结果放入数组?
但是用具有单个元素的阵列解决
我不这么认为。它应该是一个长度为2的数组,第一个元素是保存的项,第二个元素是"lastError"对象。根据save
方法的代码:
if (err) return cb(err);
if (doc === 1) {
cb(err, args[0], lastErrorObject);
} else {
// The third parameter is a faked lastErrorObject
cb(err, doc, { n : 0});
}
当回调被调用时没有错误并且结果参数超过1个时,Q.ninvoke
会自动将其转换为一个数组,用它来解析promise(来自makeNodeResolver
):
function nodecallback(error, value) {
if (error) {
deferred.reject(error);
} else if (arguments.length > 2) {
deferred.resolve(array_slice(arguments, 1));
} else {
deferred.resolve(value);
}
}