2015-01-01 24 views
1

比方說,我有處理錯誤時需要原來的參數如下同步代碼:如何將最後一個值傳遞給錯誤處理程序?

var input = createInput(123); 

try { 
    doWork(input); 
} catch (err) { 
    handleError(input, err); // error handling requires input 
} 

什麼是原來的參數傳遞給錯誤處理程序的最佳方式?

Rx.Observable.just(123).map(createInput).map(doWork).subscribe(
    function(result) { 
    // success 
    }, 
    function(err) { 
    // how can I get the argument of doWork (the result of createInput) here? 
    } 
); 

回答

1

只需將它作爲Error對象的一個​​屬性添加,然後再拋出它或像下面的包裝器代碼。

...map(function (value) { 
    try { 
     return createInput(value); 
    } 
    catch (e) { 
     e.lastValue = value; 
     throw e; 
    } 
}).subscribe(..., function (e) { 
    e.lastValue... 
+0

它看起來像我在我的問題中蒸餾了太多的例子。實際上'doWork'是異步的,即'Rx.Observable.fromNodeCallback(doWork)'。我最終封裝了'doWork'來增加原始輸入的錯誤。它的工作原理,但我希望有一些流「魔術」,避免包裝異步呼叫。 –

+0

是的,這沒有Rx魔術。這實際上只是基本的異常邏輯。你可以做的最好的「Rx」魔法就是在map操作之前插入一個'.do(function(v){someVariableInScope = v;})'子句,然後在你的錯誤處理函數中訪問這個變量。但那是相當邪惡的。 – Brandon

相關問題