2017-07-19 59 views
0

所以我有这个简单的场景,其中两个处理器的代码基本上是相同的:防止重复/拒绝回调

function runPromise(promise: Promise<any>) { 

    ret.count++; 

    return promise.then(function() { 

     ret.count--; 
     ret.count < 1 && ret.cb(); 

    }, function (err) { 

     err && console.error(err.stack || err); 

     ret.count--; 
     ret.count < 1 && ret.cb(); 

    }); 
    } 

一个解决方案,我可以用是这样的:

function runPromise(promise: Promise<any>) { 
    ret.count++; 

    let resolve = function(){ 
     ret.count--; 
     ret.count < 1 && ret.cb(); 
    }; 

    return promise.then(resolve, function (err) { 
     err && console.error(err.stack || err); 
     resolve(); 
    }); 
    } 

但我想知道是否有更清洁更优雅的方式来处理这种情况? 我不需要处理记录之外的错误。

+1

你想做什么?至于我如何阅读它,你试图阻止承诺发射两次,但承诺只发射一次,所以这将是不必要的... – dejakob

+0

我不想写在两个不同的相同的确切代码功能。 –

+0

@AlexanderMills:但为什么你有柜台呢?你应该完全摆脱它,或者用'Promise.all()'取代它,这取决于你实际上想要做什么。 http://xyproblem.info – SLaks

回答

3

是;您可以使用两个回调:

promise 
    .catch(err => err && console.error(err.stack || err)) 
    .then(...); 

catch()调用将返回一个没有错误的承诺(它返回其回调的结果的承诺),所以第二then()回调将始终运行。

但是,您的整个方法是有缺陷的,因为调用者无法知道操作是否失败。

+0

应该可以工作,但我并不是一个追捕处理程序的粉丝,因为它们可以被多次调用,对吧? –

+1

@AlexanderMills:No;每个处理程序最多只能调用一次。 '.catch(fn)'是'.then(null,fn)'的缩写。 – SLaks

+0

我认为可以不止一次调用catch,在promise中尝试一个'setInterval'并继续抛出错误:) –