2016-08-11 1 views
0

Ich habe zwei aufgerufene Funktionen, die Versprechen zurückgeben und ich möchte es sauberer machen, indem möglicherweise auf Fang-Anweisung, um die Fehler zu fangen.Aufrufe an Funktionen, die Versprechen verspricht sauberer

Ich denke, ich mache es richtig, obwohl der Code die Funktionen in der richtigen Reihenfolge asynchron aufruft.

Das sind meine Anrufe:

// The text is hopefully the email address and the pin number 
fb.verifyEmailPin(text).then(function(reply){ 

    // Set the new state to 'get_city' 
    fb.setState(FB_ID).then(function(result){ 


    }).catch(function(v) { 
     // Rejection 
     // If there was an error then prompt the user to enter again 
    }); // setState 

}).catch(function(err){ 

});// verifyEmailPin 

Und die eigentliche Funktion - für setState, ich habe den Code für die verifyEmailPin Funktion noch nicht geschrieben, aber es folgt die gleiche Struktur wie der eingestellten Zustand in Bezug auf die zurückgeben, lösen oder ablehnen.

/* 
* Function : setState 
* Purpose : Set the state to what every is send in on the parameter 
*/ 
exports.setState = function(fbid,newstate){ 

    var success = 'Y'; 
    return new Promise((resolve, reject) => { 

    client.hmset(fbid, { 'state': newstate }); 

    // Check that we have set it ok 
    client.hmget(fbid,'state',function(err,reply){ 

     if (err || reply != newstate) { 
      return reject(err); 
     } 

     return resolve(success); 

    }); 


    }).catch(function(v) { 

    }); 

} 
+0

* „der Code der Funktionen in der richtigen Reihenfolge asynchron nicht nennen.“ * -.?. Also, was das Problem ist, Sie scheinen nicht eine Frage gestellt zu haben – nnnnnn

Antwort

2

Sie können nur eine .catch am Ende verwenden. Und um weniger Eindruck zu haben, könnte man die .then verketten. Wenn Sie etwas asynchrones innerhalb von dann dann-Funktionen tun, stellen Sie sicher, ein Versprechen zurückzugeben, andernfalls warten die folgenden thens auf seinen Abschluss nicht. Auf synchrone Operationen (zB somePromise.then(JSON.parse).then(...)) ist kein Versprechen benötigt

Hier ist ein kurzes Beispiel:.

function promiseTest(x) { 
    Promise.resolve(x).then(function(a) { // instead of Promise.resolve do something asynchronous, e.g. an ajax call that returns a promise 
     if (typeof x != "number") throw "NaN"; 
     return a*2; 
    }).then(function(a) { 
     console.log(a); 
    }).catch(function(err) { 
     console.error("error in promise:", err); 
    }) 
} 
promiseTest(1); //logs 2 to the console 
promiseTest("a"); // shows error message in the console 

Wenn Sie mehrere asynchrone Operationen parallel und abwarten, bis alle von ihnen laufen Sie Promise.all können beenden verwenden, indem Sie liefert sie mit einer Reihe von Versprechungen

Promise.all([doSomethingAsyncAndReturnPromise(), somethingElseAsync()]).then(function results) { 
    // results[0] contains the result from doSomethingAsyncAndReturnPromise 
    // results[1] contains the result from somethingElseAsync 
}); 
+0

Chaining wie t Das ist wirklich der größte Vorteil, den ich fühle, wenn man Versprechen verliert. Callbacks werden in einem einzigen, synchronen Kontrollfluss zusammengefasst, und Sie können all Ihre Fehlerbehandlung an einer Stelle erledigen, wenn Sie möchten. – Squirrel

+0

Ich denke, es wäre besser, wenn Sie auch 'promiseTest (1)' und 'promiseTest (" a ")' verketten, anstatt sie so parallel laufen zu lassen. – jib

+0

@jib Das würde nicht funktionieren, da 'promiseTest' kein Versprechen gibt. Es ist auch nichts falsch daran, mehrere Versprechungen gleichzeitig zu haben ("Promise.all" ist wirklich nett), besonders wenn sie in keiner Weise voneinander abhängig sind und nicht in die anderen Versprechungen eingreifen. Und da dies wirklich nur ein Open-Browner-Konsole-und-Test-Beispiel ist, können Sie die Funktion einfach so oft aufrufen, wie Sie mit dem Verhalten experimentieren wollen ... – hsan

Verwandte Themen