我想简化这种方法:
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');
}
});
});
};
工作正常,承诺从数据库返回一个对象。
我用
替换了它module.exports.save = function (db, item) {
return Q.ninvoke(db.items, 'save', item);
};
也可以正常工作但使用单个元素的数组解析,此元素与原始代码中的相同。
为什么这样做?如何使它不将结果放入数组?
答案 0 :(得分:0)
但使用包含单个元素的数组解析
我不这么认为。它应该是一个长度为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
会自动将其转换为一个用于解析承诺的数组(来自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);
}
}