2016-08-08 2 views
1

Ich programmiere ein neues Versprechen, es hat viele verschiedene Bedingungen, die reject() oder resolve() in Bezug auf ihren Zustand aufrufen, auch ich weiß, dass der Promise-Status mit dem ersten Anruf auf reject() | festgelegt wird resolve(). Meine Frage ist: Gibt es eine native (built-in) Möglichkeit, den Versprechungsstatus zu erhalten? Das Folgende ist ein demonstrativer-Code:Wie überprüft man diesen Versprechenszustand, wenn man ein neues Versprechen programmiert? Js

exports.addStatement = function (db, description, data) { 
    return new Promise(function (resolve, reject) { 
     validator.validateStatement(description, data) 
     .then(function (data) { 
      //...... 
      if(cnd1) 
       resolve(res); 
      if(cnd2) 
       reject(err); 
      //...... 
      //How to check if this promise is rejected or resolved yet? 

     }) 
     .catch(function (err) { 
      reject(err); 
     }) 
    }) 
}; 
+0

So funktionieren Versprechen nicht. Scheint, als ob Sie das ganze Konzept der Versprechen verpasst haben. Sie können 'then()' und 'catch()' nur verwenden, nachdem das Versprechen von der Funktion zurückgegeben wurde – Roysh

+0

neuer Promise-Status ist mit einem inneren Versprechen verbunden, es funktioniert. –

+1

Zwei Bemerkungen. Warum benutzt du nicht einfach 'if() {} else if() {} else {}' oder einfach 'resolve();'? Auf diese Weise müssen Sie den Status des Versprechens überhaupt nicht kennen und Ihr Code wird sauberer. Und zweitens: Warum brauchen Sie sogar "neues Versprechen", wenn "validator.validateStatement" bereits ein Versprechen zurückgibt? – str

Antwort

2

Sie können nicht direkt den Zustand eines Versprechens untersuchen. So arbeiten sie nicht. Sie können oder .catch() auf ihnen mit einem Rückruf verwenden, um benachrichtigt zu werden.

Oder in Ihrem speziellen Fall können Sie wahrscheinlich ändern die Art, wie Ihr Code strukturiert ist, um die anti-pattern des Erstellens einer unnötigen äußeren Versprechen zu entfernen und Ihre Logik zu If/Else If/Else.

Hier ist der gereinigte Code:

exports.addStatement = function (db, description, data) { 
    return validator.validateStatement(description, data) 
     .then(function (data) { 
      //...... 
      if(cnd1) { 
       // make res be the resolved value of the promise 
       return res; 
      } else if(cnd2) { 
       // make promise become rejected with err as the reason 
       throw err; 
      } else { 
       // decide what else to do here 
      } 
     }) 
    }) 
}; 

Wenn Sie nicht eine if/else Arbeit für Sie machen könnten, die obige Struktur sollte immer noch funktionieren, weil sowohl die return und die throw die Ausführung der .then() beenden Handler. Daher ist der einzige Code, der nach ihnen fortfährt, Code, der den aufgelösten/abgelehnten Wert für das aktuelle Versprechen noch nicht festgelegt hat, so dass Sie sich den Status des Versprechens nicht ansehen müssen. Wenn der Code die return und throw überschreitet und noch ausgeführt wird, wurde keiner von diesen ausgeführt und der aufgelöste/abgelehnte Wert des aktuellen Versprechens ist noch nicht festgelegt.

+0

Danke für Ihre Antwort, ich ändere meinen Weg und entfernen Sie die 'neue Promise()' Linie, aber es scheitert, ich denke, der Punkt ist das erste 'Versprechen.dann' führt einen Async-Code, also das zweite' Versprechen.Then' wird mit einem nicht definierten Argument aufgerufen. –

+0

@RezaAfzalan - Es ist durchaus akzeptabel, Versprechungen zu verketten und '.then()' Handler werden immer asynchron aufgerufen. Versprechen sind für diese Situation wichtig. Sie müssen mehr von Ihrem echten Code (anstelle von diesem Pseudocode) zeigen, damit wir Ihnen weiterhelfen können. Die Richtung ist konzeptionell korrekt. Wir müssen Ihren tatsächlichen Code sehen, um zu wissen, was Sie sonst noch falsch machen. – jfriend00

+0

Ja, Sie können es überprüfen: https://github.com/DANA-Laboratory/modproject/blob/refactory/app/models-sqlite3/LearningX/statement.js#L57 –

Verwandte Themen