2016-06-23 7 views
0

Ich denke, es ist eine schlechte Übung, verschiedene Rückgabetypen zu haben. Also, das ist meine Funktion, und ich möchte, dass es immer ein Versprechen gibt.Meine Funktion könnte ein Versprechen oder einen Wert zurückgeben, wie kann man es vermeiden?

Ich habe versucht, das Szenario zu vereinfachen. Nehmen wir an, ich habe zwei Produktlinien (Zeile X und Zeile Y) und die Art, wie ich ein Produkt mit dem Namen abrufe, unterscheidet sich von jeder Zeile völlig von der anderen.

Bitte beachten Sie auch, dass ich im Idealfall wollte eine Funktion zu "oder" zwei Versprechen und Rückgabe, was auch immer das erfolgreich löst. Aber ich könnte mir keinen besseren Weg vorstellen!

ProductService.findProductByName = function findProductByName(name) { 
    return LineXService.findOneByName(name) // promise 
    .then(function _returnProduct(product) { 
     return product 
     ? product // value 
     : LineYService.findOneByName(name)); // promise 
    }) 
}; 
+0

warte ... das führt immer zu einem Versprechen. Wo ist die Frage? –

+0

@KevinB 'Produkt' ist kein Versprechen, sondern etwas, das durch ein Versprechen zurückgegeben wird. – tadman

+3

Richtig, aber es wird in einem .then Callback zurückgegeben. Die Gesamtfunktion gibt immer noch ein Versprechen. –

Antwort

1

Sie haben Recht, dass die Rückgabe einer konsistenten Sache besser ist als ein mehrdeutiges Ergebnis. Normalerweise können Sie einen beliebigen Wert in ein Versprechen leicht genug werfen. Zum Beispiel mit resolve:

if (product) { 
    return Promise.resolve(product); 
} 

return LineYService.findOneByName(name); 

Es ist bemerkenswert, wie Kevin B beobachtet, dass dies in diesem speziellen Fall nicht relevant ist, da Ihre äußeree Funktion immer ein Versprechen zurück. Die Notwendigkeit, einen Wert zu verkünden, ist nur dann ein Problem, wenn dies nicht Teil eines umgebenden Versprechens ist.

Verwandte Themen