为什么Q.ninvoke返回一个数组?

时间:2014-09-25 04:03:01

标签: node.js mongodb promise q

我想简化这种方法:

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

也可以正常工作但使用单个元素的数组解析,此元素与原始代码中的相同。

为什么这样做?如何使它不将结果放入数组?

1 个答案:

答案 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);
    }
}