2016-03-23 55 views
1

我發現自己編寫了很多處理數據可能不可用的情況的Promise代碼,並且我不確定是否在這種情況下傳遞null或throw/catch。Promise有條件返回:拋出vs返回null

例如:

users.getById(id).then((user) => { 
    if (!user) { 
    return null; 
    } 
    return doSomething(user); 
}); 

可以寫成

users.getById(id).then((user) => { 
    return doSomething(user); 
}).catch((e) => { 
    // User wasn't found 
}); 

要麼這些通常最好還是習慣以某種方式,或者是它最好遵循我的直覺在每種情況下?

+0

第二個看起來更漂亮 –

回答

2

如果函數被調用users.getById那麼它的回調應該有一個用戶對象,句點。獲得用戶對象的承諾只有在實際獲得用戶對象時才能實現。

投擲typed Error instances指示各種錯誤條件。

users.getById(id).then((user) => { 
    return doSomething(user); 
}).catch((e) => { 
    switch (e.Name) { 
     case "UserNotFound": 
      // User wasn't found 
      break; 
     default: 
      // unexpected error 
    } 
}); 

bluebird承諾圖書館explicit support for typed exceptions和獨立support for catching operational errors,你可以模仿這種行爲。或者你可以只使用藍鳥:

users.getById(id).then((user) => { 
    return doSomething(user); 
}).error(UserNotFound, (e) => { 
    // User wasn't found 
}).catch((e) => { 
    // unexpected error 
}); 
1

如果這是一個API調用,通常情況下,要保存爲消費者拋出一部分,而不是在內部處理它。

...或者在內部處理轉換爲JSON的部分,但是如果有加載錯誤或轉換錯誤,讓外部世界與oops一起生活。

這是我的意思;我們跳過承諾爲第二:

function getData() { 
    var data = null; 
    try { 
    data = getSomeData(); 
    } catch (e) { } // ignore it 

    return data; 
} 


var data = getData(); 
var name = data.property.name; // BOOM 

如果它要扔,你應該抓住它(它會更好,如果沒有拋出,但好些,因爲它會拋出,比不了知道)。

function getData() { 
    var data = getSomeData(); 
    return data; 
} 


var data; 
var name; 
try { 
    data = getData(); 
    name = data.property.name; 
} catch (e) { /* now at the right level */ } 

當然投擲一般不是很好。也不是null,這取決於你在函數式編程中的立場。

如果我們做這個是返回一個承諾一個電話:

function getData() { 
    return callServer() 
    .then(response => JSON.parse(response)); 
} 

getData() 
    .then(showData) 
    .catch(showError); 

如果錯誤是內部處理的,它永遠不會使它的最終用戶來處理的事實,他們的東西丟失。如果您返回空值,那麼他們必須在其then()中執行各種null-檢查。