2016-06-27 22 views
0

Es ist schwer zu lernen, wie die verzögerte Antipatern mit den Informationen zu vermeiden, die ich finden konnte. Ich verwende eine Q-Bibliothek für Nodejs.Wie zu vermeiden, verzögerte Antipattern

Da es möglich ist, im Grunde zu lesen, müssen wir versuchen, eine Zusage mit deferred.reject oder deferred.resolve nicht abzulehnen oder zu beantworten.

deferred.resolve muss durch einen Return-Satz ersetzt werden, so dass der Punkt ziemlich einfach ist.

Das Problem kommt, wenn ich ein Versprechen innerhalb einer Funktion verwenden möchte, die die Ausführung in einigen Fällen ablehnen muss, die keine Anwendungsfehler sind. Zum Beispiel:

Services.data.isNotForbiddenFieldToUpdate(bodyKeys,forbidden) 
.then(() => console.log('Finish')) 

Wo

isNotForbiddenFieldToUpdate: (fieldsToUpdate,forbiddenFields) => { 
    var deferred = Q.defer(); 

    //DO A QUERY AND STORE IN result PARAM 

    if(err)   deferred.reject(err) 
    else if(! result) deferred.reject(new Error('Query is empty.')); 
    else    deferred,resolve(); 
    return deferred.promise; 
} 

In diesem Fall nicht möglich ist, etwas anderes deferred.promise zurückzukehren. Wenn ich das entferne und true zurückgebe, ist der Fehler, dass then unbekannt ist.

Wie kann ich diese Art von Code verwalten, ohne zurückgestellt zu verwenden, wenn dies möglich ist? Vielen Dank.

+1

Ist die Abfrage eine asynchrone Operation? Wenn ja, machst du das Richtige, indem du ein Versprechen eingibst. Andernfalls geben Sie kein Versprechen ab. –

+0

Könnten Sie explizit das verzögerte Antipattern angeben, auf das Sie verweisen? Ich bin wirklich neugierig, was du vermeiden willst. Versprechen sind ein Werkzeug, um die Callback-Hölle zu vermeiden. – zero298

Antwort

0
isNotForbiddenFieldToUpdate: (fieldsToUpdate,forbiddenFields) => { 
    var deferred = Q.defer(); 

    //DO A QUERY AND STORE IN result PARAM 

Wenn Sie an dieser Stelle annehmen, dass die "QUERY" eine asynchrone Operation ist, erhalten Sie eine Zusage zurück. Sie müssen also wahrscheinlich kein weiteres Versprechen erstellen, sondern nur das von Ihrer "QUERY" kommende verwenden.

return yourAsyncQuery(); 

Oder, wenn Sie die Dinge auf das Ergebnis Ihrer „QUERY“ hinzufügen müssen, dann haben Sie es einen Rückruf geben auszuführen, wenn es abgeschlossen ist. Innerhalb dieses Rückrufs lösen oder verwerfen Sie das Versprechen (Q).

yourAsyncQuery().then(
     function(result) { 
      if (! result) 
       deferred.reject(new Error('Query is empty.')); 
      // do more stuff with 'result'. 
      deferred.resolve(result); 
     }, 
     function(error) { 
      deferred.reject(error); 
     } 
    ); 
    return deferred.promise; 
} 
0

Ich weiß nicht, wie in Q ist, aber mit nativer Versprechen Sie tun können, wie folgt:

isNotForbiddenFieldToUpdate: (fieldsToUpdate,forbiddenFields) => 
    new Promise((resolve, reject) => { 
     //DO A QUERY AND STORE IN result PARAM 
     if(err){   
      reject(err); 
     } else if(! result){ 
      reject(new Error('Query is empty.')); 
     } else { 
      resolve(); 
     } 
    } 

ich mit Q denke ähnlich sein sollte. Wie auch immer, es sei denn, Sie benötigen eine sehr spezifische Q-Funktionalität, würde ich lieber native Promises verwenden.