2016-02-25 65 views
1

我是使用藍鳥承諾庫的新手。我想知道是否有更好的方法來包裝複雜的分支語句,可能需要也可能不需要異步調用,而不是我目前正在做的。什麼我現在有如何包裝需要異步調用的複雜if-then語句?

例如:

(function() { 

    if (a) { 
     return ModelA.findById(id); 
    } else if (b) { 
     return ModelB.findById(id); 
    } else if (c) { 
     return ModelC.findById(id); 
    } else { 
     return Promise.reject(new Error('a, b, or c must be specified')); 
    } 
})() 
.then(function(result) { 
    if(result == null) { 
     return new Error('Object not found') 
    } 
    result.removedBy = user.id; 
    result.removedWhen = new Date(); 
    result.inactive = true; 
    return result.save(); 
}) 
+1

這裏我沒有看到很大的改進潛力。當然,你可以使用三元運算符而不是「if」(這可以省略IIFE),並且你只能區分模型而不是方法調用,但是你正在做的事情是非常好的和可讀的。 – Bergi

+0

「a」,「b」和「c」究竟是什麼? – Bergi

回答

2

我會改變的唯一的事情是將其放在一個.then

Promise.resolve() 
.then(function() { 
    if (a) return ModelA.findById(id); 
    if (b) return ModelB.findById(id); 
    if (c) return ModelC.findById(id); 
    throw new Error('a, b, or c must be specified'); 
}) 
.then(function(result) { 
    if (!result) { 
     return new Error('Object not found'); 
    } 
    result.removedBy = user.id; 
    result.removedWhen = new Date(); 
    result.inactive = true; 
    return result.save(); 
}) 
.catch(e => console.error(e)); 

這有更好的錯誤處理的特點:你不必擔心異常和拒絕,並且潛在的編碼錯誤以與其他錯誤相同的方式處理。

.then中有一個額外的優點,不用擔心總是返回一個承諾(因爲返回的東西會自動包裝成一個),一個不變的,更可讀的。