编程语言
首页 > 编程语言> > javascript – $q:默认拒绝处理程序

javascript – $q:默认拒绝处理程序

作者:互联网

我想返回一个$q实例,这样如果客户端没有使用拒绝处理程序调用’then’,那么默认运行.

例如.假设默认是警报(1)

然后mypromise.then(function(result){…})将提醒1但mypromise.then(null,function(reason){alert(2)})将提醒2

解决方法:

让我们假设有一种方法可以做到这一点.

因此,我们有一个神奇的机器,可以随时查明.then是否使用函数第二个参数调用特定的承诺.

所以呢?

所以你可以检测出是否有人做了:

myPromise.then(..., function(){ F(); });

随时随地都可以.并将G()作为默认操作.

和…?

您可以使用包含大量代码P(1)的整个程序并将该代码转换为:

var myPromise = $q.reject();
P; // inline the program's code
myPromise.then(null, function(){}); // attach a handler

太棒了,所以我能做到,所以呢?

好吧,现在我们的神奇机器可以采用任意程序P并检测myPromise是否添加了拒绝处理程序.现在,当且仅当P不包含无限循环(即它停止)时,才会发生这种情况.因此,我们检测是否添加了捕获处理程序的方法是reducedthe halting problem.这是impossible.(2)

所以一般情况下 – 无法检测.catch处理程序是否附加到promise.

停止使用mumbu-jumbo,我想要一个解决方案!

反应很好!像许多问题一样,这个问题在理论上是不可能的,但在实践中很容易解决实际情况.这里的关键是启发式:

If an error handler is not attached within a microtask (digest in Angular) – no error handlers are ever attached and we can fire the default handler instead.

这大致是:你永远不会.then(null,function(){})异步. Promise是异步解析的,但处理程序通常是同步连接的,所以这很好用.

// keeping as library agnostic as possible.
var p = myPromiseSource(); // get a promise from source
var then = p.then; // in 1.3+ you can get the constructor and use prototype instead
var t = setTimeout(function(){ // in angular use $timeout, not a microtask but ok
    defaultActionCall(p);// perform the default action!
});
// .catch delegates to `.then` in virtually every library I read so just `then`
p.then = function then(onFulfilled, onRejected){
    // delegate, I omitted progression since no one should use it ever anyway.
    if(typeof onRejected === "function"){ // remove default action
        clearTimeout(t); // `timeout.cancel(t)` in Angular     
    }
    return then.call(this, onFulfilled, onRejected);
};

这就是全部?

好吧,我只是想补充一下,需要这种极端方法的情况很少见.在讨论向io添加拒绝跟踪时 – 有几个人建议如果一个承诺在没有捕获的情况下被拒绝,那么整个应用程序可能会终止.所以要格外小心:)

(1)假设P不包含变量myPromise,如果它将myPromise重命名为P不包含的内容.

(2)当然 – 可以说,只要读取P的代码并且不运行它就足以检测myPromise获取拒绝处理程序.在形式上我们说我们将P中的每个返回和其他形式的终止更改为返回myPromise.then(null,function(){}),而不是简单地将它放在最后.这样就可以捕获“条件性”.

标签:angular-promise,javascript,angularjs,promise
来源: https://codeday.me/bug/20190728/1559650.html