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.
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. –