【问题标题】:NodeJS promises vs. callbacks: is there a reason not to support both?NodeJS 承诺与回调:有理由不支持两者吗?
【发布时间】:2015-09-06 21:12:49
【问题描述】:

我今天想知道我是否不能简单地同时支持回调和承诺。你能想到什么缺点吗?

function fetchUser(data, success, error) {
    var deferred = Q.defer();

    var body = {
        sharedSecret: config['apiSharedSecret'],
        deviceAuth: data.deviceAuth,
        username: data.username,
        phoneNumber: data.phoneNumber
    };

    request.post({
        url: url,
        json: body,
    }, function (err, httpResponse, body) {
        if (err) {
            deferred.reject(new Error(err));
            if (typeof error === "function") {
               error.call(this, err);
            }  
            return;
        }            

        if (typeof success === "function") {
            success.call(this, body);
        }

        deferred.resolve(body);
    });

    return deferred.promise;
}

【问题讨论】:

  • 教育您的用户接受承诺 :-) 不再需要回调参数。
  • 请记住,promise 也是回调,但它们比普通回调有更多的特性和功能,特别是在异步错误传播和管理多个异步操作时。所以,你的问题实际上更像是,当功能更多的回调现在被认为是一种标准时,为什么要支持功能更少的回调形式?

标签: javascript node.js promise q


【解决方案1】:

缺点是它会使您的代码更加复杂。此外,没有任何情况下回调比 Promise 有任何优势,因此这样做没有意义。但是如果你想这样做,你可能应该写一个这样的函数来避免代码重复。

function defer(success, error) {
  var deferred = Q.defer();
  deferred.promise.then(success, error);
  return deferred;
}

【讨论】:

  • Promises 使代码更简洁(最近我发现生成器似乎使代码优雅向前迈进了一步),但是没有任何情况下更容易调试回调吗?
  • 我想不出任何这样的情况。你有例子吗?
猜你喜欢
  • 2018-05-04
  • 1970-01-01
  • 2014-04-27
相关资源
最近更新 更多