Itt*_*ayD 3 javascript promise angularjs angular-promise
我想返回一个$ q实例,这样如果客户端没有使用拒绝处理程序调用'then',那么默认运行.
例如,假设默认为 alert(1)
然后mypromise.then(function(result){...})将提醒1,但mypromise.then(null, function(reason){alert(2)})会提醒2
所以我们有一个神奇的机器,总能找出是否.then使用函数第二个参数调用特定的承诺.
所以你可以检测出是否有人做了:
myPromise.then(..., function(){ F(); });
Run Code Online (Sandbox Code Playgroud)
随时随地都可以.并G()作为默认操作.
您可以使用包含大量代码P (1)的整个程序并将该代码转换为:
var myPromise = $q.reject();
P; // inline the program's code
myPromise.then(null, function(){}); // attach a handler
Run Code Online (Sandbox Code Playgroud)
好吧,现在我们的神奇机器可以采用任意程序P并检测是否myPromise添加了拒绝处理程序.现在,只有当P不包含无限循环(即它停止)时才会发生这种情况.因此,我们检测是否添加了捕获处理程序的方法被简化为停止问题.这是不可能的.(2)
所以一般情况下 - 无法检测.catch处理程序是否附加到承诺.
反应很好!像许多问题一样,这个问题在理论上是不可能的,但在实践中很容易解决实际情况.这里的关键是启发式:
如果错误处理程序没有附加在微任务中(Angular中的摘要) - 没有附加错误处理程序,我们可以触发默认处理程序.
这大致是:你永远不会 .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);
};
Run Code Online (Sandbox Code Playgroud)
好吧,我只是想补充一下,需要这种极端方法的情况很少见.在讨论向io添加拒绝跟踪时 - 有几个人建议如果一个承诺被拒绝而没有一个,catch那么整个应用程序可能会终止.所以要格外小心:)
(1)假设P不包含变量myPromise,如果它将myPromise重命名为P不包含的内容.
(2)当然 - 可以说,只要读取P的代码并且不运行它就足以检测myPromise获取拒绝处理程序.在形式上我们说我们将returnP和其他形式的终止中的每一个都return myPromise.then(null, function(){})改为a 而不是简单地将它放在最后.这样就可以捕获"条件性".