【问题标题】:Learning promises and exceptions vs. rejecting in Q在 Q 中学习 promises 和 exceptions 与拒绝
【发布时间】:2013-11-18 18:30:08
【问题描述】:

我的印象是,promise 中的异常会触发后续的失败处理程序,但我没有在这段代码中看到它发生:

var Q = require('q');

function x() {
  console.log('x');
  var deferred = Q.defer();

  setTimeout(
      function() {
        console.log('resolving x');
        deferred.resolve('hi');
      },
      1000
  );

  return deferred.promise;
}

function y() {
  console.log('y');
  var deferred = Q.defer();

  setTimeout(
      function() {
        console.log('throwing in y');
        throw new Error('Oih!');
      },
      1000
  );

  return deferred.promise;
}

x().then(y).then(
    function () {
      console.log('yes');
    },
    function () {
      console.log('no');
    }
);

是我做错了什么,还是我误解了?

【问题讨论】:

    标签: javascript node.js promise q


    【解决方案1】:

    你正在混合回调和承诺 + 你有一个延迟反模式的情况。使用Q.delay 或像这样的包装器:

    function delay(ms) {
        var d = Q.defer();
        setTimeout(d.resolve, ms);
        return d.promise;
    }
    

    既然有超时的promise API,就没有理由使用setTimeout了:

    function x() {
        return delay(1000).then(function () {
            console.log("hi");
        });
    }
    
    function y() {
        return delay(1000).then(function () {
            console.log('throwing in y');
            throw new Error('Oih!');
        });
    }
    

    用途:

    x()
    .then(y)
    .then(function() {
        console.log('yes');
    })
    .catch(function(e) {
         console.log('no');
    });
    

    【讨论】:

      【解决方案2】:

      Promise 链中的所有异常都会被捕获。您必须像以前一样管理失败的 Promise,或者使用 done() 结束 Promise 链以暴露并抛出错误(请参阅 the documentation)。

      但是,您在setTimeout 中抛出的错误与承诺无关,因为错误是异步抛出的,例如参见this relevant question。另一种方法是像这样拒绝承诺:

      function y() {
        console.log('y');
        var deferred = Q.defer();
      
        setTimeout(
            function() {
              console.log('throwing in y');
              deferred.reject(new Error('Oih!'));
            },
            1000
        );
      
        return deferred.promise;
      }
      

      【讨论】:

        猜你喜欢
        • 2016-06-09
        • 2016-01-31
        • 1970-01-01
        • 2016-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多