Q.invoke为什么返回一个数组



我想简化这个方法:

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

相关内容

  • 没有找到相关文章

最新更新