2017-03-21 6 views
0

Super grundlegende Frage: Ich bin neu bei NodeJS sowie Promises, neugierig, ob ich die resolve() korrekt verwende.resolve() im Handbuch bluebird Versprechen

_queryHelper(query, fields) 
 
    { 
 
     return new Promise((resolve, reject) => { 
 
      connector.query(query, fields, (error, results) => { 
 
       if(error) 
 
       { 
 
        connector.rollback(() => { 
 
         reject(error); 
 
        }); 
 
       } 
 
       if(results) 
 
       { 
 
        return resolve(results); 
 
       } 
 
       resolve(); 
 
      }); 
 
     }); 
 
    }; 
 
    
 
// later on doing something like: 
 
this._queryHelper('SELECT * FROM secretTable WHERE `generatedURL` = ?', stringIn) 
 
.then((resultsIn) => { 
 
    if(!resultsIn || resultsIn.length === 0) { 
 
     // do somthing 
 
    } 
 
    else { 
 
     // do something else 
 
    } 
 
});

So ist die Frage direkt ist, wenn ich die .then() verwenden, bin ich sprudeln richtig die Ergebnisse aus der Urverheißung Abfrage aus? Im Grunde versuche ich genau zu bestimmen, wo meine ursprüngliche 'Rückkehr Auflösung (Ergebnisse)' tatsächlich geht, so dass ich auf die oben genannten 'Ergebnisse' zugreifen kann

EDIT: beim Auflösen von resolve (Ergebnisse) von _queryHelper, bin ich richtig verstanden 'Ergebnisse' wird an meine .then als 'resultsIn' übergeben?

+0

Dank , das war hauptsächlich, was ich suchte, wollte sicherstellen, dass ich zwischen meinem Entschluss richtig verkettet war (re sult) und meine .then (Ergebnisse), und es klingt, als wäre ich es. Danke für den logischen Fang! – ItsScience

+0

Da es so aussieht, als ob Sie neu hier sind, können Sie, wenn eine der Antworten unten Ihre Frage beantwortet, dies der Community anzeigen, indem Sie auf das grüne Häkchen neben der besten Antwort klicken. Dadurch erhalten Sie auch einige Reputationspunkte auf dem Stack-Überlauf, um das richtige Verfahren zu befolgen. – jfriend00

Antwort

0

Wenn Sie nur fragen, ob Ihr Code funktioniert, dann sollte ja Ihr Ergebniswert genau dort angezeigt werden, wo Sie es haben wollen, wenn Sie keinen Fehler haben.

resolve(results) wird results erscheinen in Ihrem Handler.

Ich sehe drei Hauptprobleme mit Ihrem Code:

  1. Ihre Fehlerbehandlung nicht richtig funktioniert. Sie haben ein logisches Problem, wenn results nicht definiert ist.
  2. Sie vermissen ein .catch(), um Fehler zu behandeln.

Sie haben ein logisches Problem in Ihrem .then() Handler, wenn es keine Ergebnisse gibt, weil:

if (results.length) 

wird werfen, wenn resultsundefined ist. Um sicher zu sein, können Sie die if dazu ändern:

if (!results || results.length === 0) 

Sie sollten auch ein Problem beheben haben Sie, wenn es einen Fehler, so dass Sie nicht auch resolve() aufrufen, wenn ein Fehler auftritt. Ich würde vorschlagen, dies zu ändern:

_queryHelper(query, fields) { 
     return new Promise((resolve, reject) => { 
      connector.query(query, fields, (error, results) => { 
       if (error) { 
        connector.rollback(() => { 
         reject(error); 
        }); 
       } else { 
        resolve(results); 
       } 
      }); 
     }); 
    }; 

    // later on doing something like: 
    this._queryHelper('SELECT * FROM secretTable WHERE `generatedURL` = ?', stringIn).then((resultsIn) => { 
     if (!resultsIn || resultsIn.length === 0) { 
      // do somthing 
     } else { 
      // do something else 
     } 
    }).catch(err => { 
     // handle errors here 
    }); 
+0

@ItsScience - Ich habe Informationen über zwei weitere Fehler hinzugefügt, die Sie haben. – jfriend00

0

bin ich recht in der Erkenntnis, dass results meiner .then Rückruf als resultsIn geben wird?

Ja, das funktioniert wie erwartet.

Ihr Code funktioniert jedoch nicht, da Sie immer resolve() aufrufen, auch wenn ein Fehler aufgetreten ist. Dies ist ein Problem, vor allem seit Sie versuchen, reject() das Versprechen nach dem Zurückrollen Ihres Connectors - aber bis dahin ist das Versprechen bereits gelöst.

return new Promise((resolve, reject) => { 
    connector.query(query, fields, (error, results) => { 
     if (error) { 
      connector.rollback(() => { 
       reject(error); 
      }); 
     } else { // <=== 
      if (results) 
       return resolve(results); 
      resolve(); 
     } 
    }); 
}); 

(oder ein return nach dem Rollback-Start): Sie erhalten eine else benötigen.Und Sie werden auch nicht if (results) Test überhaupt brauchen - Sie beheben mit undefined sowieso, wenn es falsch ist. Besser nur

return new Promise((resolve, reject) => { 
    connector.query(query, fields, (error, results) => { 
     if (error) { 
      connector.rollback(() => { 
       reject(error); 
      }); 
     } else { 
      resolve(results); 
     } 
    }); 
}); 

Das heißt, mit Drossel sollten Sie nie den Promise Konstruktor verwenden müssen, wenn es automatic promisification:

const queryConnector = Promise.promisify(connector.query, {context: connector}); 
const rollbackConnector = Promise.promisify(connector.rollback, {context: connector}); 

function _queryHelper(query, fields) { 
    return queryConnector(query, fields).catch(error => 
     rollbackConnector().throw(error) 
    ); 
} 

oder noch einfacher:

Promise.promisifyAll(connector); 

function _queryHelper(query, fields) { 
    return connector.queryAsync(query, fields).catch(error => { 
     return connector.rollbackAsync().throw(error); 
    }); 
} 
Verwandte Themen