2015-08-18 14 views
6

Es scheint, dass, wenn die Funktion 'Auflösen' in der Funktion, die zum Erstellen einer Zusage verwendet wird, nicht referenziert wird, die Zusage nicht definiert ist. Im folgenden Code, ...Warum kehrt 'neues Versprechen (...)' undefiniert 'zurück?

var count = 0; 
var limit = 3; 
// 
var thePromise; 
function timeout(_count) { 
    thePromise.resolve(_count); 
} 
function sendMessage() { 
    return new Promise(function(resolve, reject) { 
     if (++count > limit) { 
      reject({'Limit Exceeded': count}); 
     } 
     else { 
// With this line in place, the return value from this function 
// (expected to be a promise) is undefined 
      setTimeout(timeout.bind(null, count), 1000); 
// If the line above is replaced by this, it works as expected 
//   setTimeout(/*timeout.bind(null, count)*/function (_count) { 
//    resolve(_count); 
//   }.bind(null, count), 1000); 
     } 
    }); 
} 

function sendAnother(_count) { 
    console.log('Resolved with count %j', _count); 
    return sendMessage(); 
} 
function detectError(_error) { 
    console.log('Rejected with %s', JSON.stringify(_error)); 
    process.exit(1); 
} 
thePromise = sendMessage(); 
thePromise = thePromise.then(function (_count) { return sendAnother(_count)}, function(_error) {detectError(_error)}); 

versuchen, die Entschlossenheit außerhalb der Funktion zu tun, die das Versprechen, ergibt schafft:

node-promises.js:6 
    thePromise.resolve(_count); 
      ^
TypeError: undefined is not a function 
    at timeout (node-promises.js:6:16) 
    at Timer.listOnTimeout (timers.js:110:15) 

Aber wenn Linie 16 ist kommentiert und Linien 18- 20 sind unkommentiert, die Ausgabe ist:

.. was ich erwartet habe. Was vermisse ich? Dies verwendet nodejs v0.12.2 unter Windows 7, wenn dies einen Unterschied macht.

Antwort

7

Es geschieht, weil diese Linie:

thePromise.resolve(_count); 

es keine resolve Funktion für das Objekt. resolve stammt aus der Funktion, die Sie erstellt haben, wenn das neue Versprechen Instanziierung:

return new Promise(function(resolve, reject) { 

Durch kommentieren Sie diese Zeile aus, und unter Verwendung der alternativen Funktion, Sie die richtige resolve() anrufen, die die gewünschte Ausgabe verursacht. Eine Möglichkeit, dies zu beheben könnte die Entschlossenheit Funktion in Ihren Timeout Aufruf übergeben, zB:

function timeout(resolve, _count) { 
    resolve(_count); 
} 

Obwohl ich nicht sicher bin, warum Sie dies tun wollen.


Ihr Titel fragt, warum new Promise nicht definiert ist Zurückgeben, wenn die Tatsache ist, dass es nicht ist. Es gibt tatsächlich ein gültiges Versprechen zurück. Nur resolve ist keine gültige Funktion für das Zusicherungsobjekt.

+2

Danke Matt - Ihre vorgeschlagene Änderung lässt es wie erwartet funktionieren. Ich denke, dass ich dort, wo ich falsch gelaufen bin, erwartet habe, dass die 'resolve()' - Funktion in dem Versprechen gespeichert wird; aber es scheint, dass es nur während des Aufrufs von 'then()' definiert wird. –

Verwandte Themen