2016-06-14 16 views
0

Ich schreibe ein Modul, das die Google-API verwendet, aber alles umschließt, was Callback-basiert in einem Versprechen ist. Dies ist der Code des ProblembereichsPromise-Abweisung funktioniert nicht innerhalb des Rückrufs

file1.js

var File2 = require('file2') 
var api = new File2() 
api.auth().then(auth => { 
    api.search('example').then(res => { 
    ...do some stuff... 
    }) 
}).catch(err => { 
    console.log('1') //Not being run 
    throw err 
}) 

file2.js

class File2(){ 
    auth() { 
    ...works fine and resolves... 
    } 

    search() { 
    return new Promise((resolve, reject) => { 
     googleapi.somemethod(options, (err, res) => { 
     if(err) { 
      console.log('2') // DOES run 
      reject(new Error(err)) 
     } 
     resolve(res.field) //Program crashes here because reject didn't actually reject 
     }) 
    }) 

} 

Der Aufruf von auth funktioniert ganz gut, aber der Anruf an search (und insbesondere googleapi.somemethod) ist fehlgeschlagen, und err ist definiert. Ich überprüfe nach Fehler, und console.log('2') läuft, aber dann console.log('1') in catch nicht ausgeführt wird, wird der Fehler nicht ausgelöst, und das Programm stürzte auf resolve(res), weil res nicht definiert ist. Ich habe versucht, zu then den Fehler Fang als zweites Argument setzt stattdessen catch zu verwenden, aber das noch nicht

api.search('example').then(res => { 
    ...do some stuff... 
}, err => { 
    console.log('2') // Still doesn't run 
    throw err 
}) 

Ich renne Knoten V6.2.1

+0

Sollten Sie nicht 'return' das Versprechen verkürzen ? Sollte es auch kein "else" geben? Es sieht so aus, als würde "resolve" immer aufgerufen, egal ... – elclanrs

+0

Bekomme ich das Versprechen nicht zurück? Ich habe noch nie jemanden gesehen, der etwas wie > return resolve() oder > return reject() Und für die sonst, könnten Sie Recht haben. Ich befolge das übliche Muster der Behandlung von Callbacks, die etwas zurückgeben, aber yeah das funktioniert vielleicht nicht für Versprechungen. Ich hatte es immer in meinem Kopf, obwohl diese "Entschlossenheit" und "Zurückweisung" sich wie eine Rückkehr verhält, aber das könnte nur ein Loch in meinem Wissen um Versprechen sein. – Weston

+0

Überprüfen Sie meine Antwort, hoffe, dass das hilft. Vergiss auch nicht den "else" -Teil. – elclanrs

Antwort

3

Sie sollten das Versprechen zurückgeben funktioniert :

var File2 = require('file2') 
var api = new File2() 
api.auth().then(auth => { 
    return api.search('example').then(res => { // return the promise 
    return ... 
    }) 
}).catch(err => { 
    console.log('1') // Not being run 
    throw err 
}) 

auch wenn Sie nicht auth innerhalb search benötigen, dann können Sie diese Versprechen UNNEST:

var File2 = require('file2') 
var api = new File2() 
api.auth().then(auth => { 
    return api.search('example') 
}).then(res => { 
    return ... 
}).catch(err => { 
    console.log('1') //Not being run 
    throw err 
}) 
+0

Vergiss den "else" -Teil. – elclanrs

+0

Nachdem ich gemacht habe, was Sie gesagt haben, läuft meine 'console.log' innerhalb von' catch', aber 'throw err' stürzt das Programm nicht ab. Irgendeine Idee, warum das sein würde? – Weston

+0

'throw' sollte Ihr Programm nicht innerhalb eines Versprechens zum Absturz bringen, das ist Absicht. In einem Versprechen 'throw err === return Promise.reject (err)', so würden Sie den Fehler bei einem späteren '.catch()' behandeln, wie '.catch (err => throw err) .catch (handleError)) ' – elclanrs

3

Aufruf Reject() stoppt nicht Ihr Programm, alle Codes unten werden auch ausgeführt.

Bitte aktualisieren Sie von

if(err) { 
    console.log('2') // DOES run 
    reject(new Error(err)) 
} 
resolve(res.field) //Program crashes here because reject didn't actually reject 

zu

if(err) { 
    console.log('2') // DOES run 
    reject(new Error(err)) 
} 
else { 
    resolve(res.field) //Program crashes here because reject didn't actually reject 
} 

* update * oder Sie können Ihren Code

if(err) { 
    console.log('2') // DOES run 
    return reject(err) // no need to new Error object 
} 
resolve(res.field) //Program crashes here because reject didn't actually reject 
+0

Ich habe auch darüber nachgedacht, aber das ist nicht der Fall, weil ein Versprechen nur in einem Zustand sein kann. Wenn es ablehnt, kann es nicht aufgelöst werden. Ich würde es immer noch mit dem 'else' schreiben, weil es den Fluss klarer macht. – elclanrs

+0

oder du kannst der 2. Lösung folgen, die ich update @elclanrs –

+0

Ja, das ist eine andere Option, um es klarer zu machen, aber der Punkt steht immer noch, sobald Sie die Auflösung zurückweisen wird nicht aufgerufen werden. Siehe https://jsfiddle.net/g8yufxfa/ – elclanrs

Verwandte Themen