2017-07-19 54 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'並繼續拋出錯誤:) –