2013-10-08 85 views
4

我想知道是否有任何方法可以自動將錯誤從承諾傳播到另一個承諾? IE:從嵌套的承諾中捕獲拋出的錯誤。q.js自動傳播錯誤(捕獲異步拋出的錯誤)?

例如,在以下代碼示例中,爲了傳播錯誤,「internalWorker」嵌套的promise函數需要 .fail(function (error) { return deferred.reject(error); }); 。如果沒有包含這一行,則錯誤將被置頂。 (崩潰的應用程序)

是否有可能自動傳播錯誤,所以我不需要添加.fail()函數我所有的嵌套承諾?

```

function top(input) { 
    var deferred = q.defer(); 

    internalWorker(input).then(function (value) { 
     logger.inspectDebug("top success", value); 
    }).fail(function (error) { 
     return deferred.reject(error); 
    }); 

    return deferred.promise; 
} 

function internalWorker(input) { 
    var deferred = q.defer(); 

    q.delay(100).then(function() { 
     throw new Error("internal worker async error"); 
    }).fail(function (error) { 
     return deferred.reject(error); 
    }); 

    return deferred.promise; 
} 

top("hello").then(function (value) { 
    logger.inspectDebug("outside success", value); 
}).fail(function (error) { 
    logger.inspectDebug("outside fail", error); 
}).done(); 

```

回答

2

如果您正在使用https://github.com/kriskowal/q,這會做你想要什麼:

function top(input) { 
    return internalWorker(input).then(function (value) { 
     logger.inspectDebug("top success", value); 
     return value; 
    }); 
} 

function internalWorker(input) { 
    return q.delay(100).then(function() { 
     throw new Error("internal worker async error"); 
     return value; 
    }); 
} 

top("hello").then(function (value) { 
    logger.inspectDebug("outside success", value); 
}, function (error) { 
    logger.inspectDebug("outside fail", error); 
}).done(); 

返回承諾或值的回調中。錯誤隱式傳播。

+1

謝謝!正如你的解決方案所描述的,以及我從閱讀qdts的typescript定義中看到的:promise.then()和promise.fail()將允許承諾的嵌套(或者如果它不是承諾已經) 太棒了!現在我明白了,它將我的代碼減少了大約66%(去除了中級功能的錯誤處理) 對於初學者(像我),文檔有點難以理解......但現在我明白了它,我不能回去! – JasonS