2015-08-18 26 views
6

'Çözüm' işlevi bir söz oluşturmak için kullanılan işlevde başvurulmuyorsa, söz verilişi tanımsızdır. Aşağıdaki kod, ... yılında söz yaratan fonksiyonun dışında kararlılığını yapmaya çalışıyorNeden 'yeni Promise (...)' tekrar 'tanımlanmamış'?

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)}); 

, sonuçları:

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) 

Ama hat 16 ve çizgileri geçersiz kılınırsa 18- 20 uncommented, çıktı:

Resolved with count 1 

.. beklediğim şey budur. Neyi kaçırıyorum? Bu, Windows 7'de nodejs v0.12.2 kullanıyor, eğer herhangi bir fark yaratıyorsa.

cevap

7

Çünkü bu hattın olur:

thePromise.resolve(_count); 

bu nesne üzerinde hiçbir resolve işlevi yoktur. resolve yeni umut başlatmasını Oluşturduğunuz işlevinden gelir:

return new Promise(function(resolve, reject) { 

o satırı dışında yorum ve alternatif işlevini kullanarak, istenen çıktıyı neden doğru resolve(), çağrıda bulunuyorlar. Bunu düzeltmek için bir seçenek, zaman aşımı çağrı içine örn çözmek işlevini geçmek olabilir:

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

Bunu yapmak için neden isteyeyim emin değilim rağmen. new Promise tanımsız dönen neden gerçeği olmadığıdır zaman


Unvanınız sorar. Gerçekten geçerli bir söz veriyor. Sadece resolve söz konusu nesne üzerinde geçerli bir işlev değildir.

+2

Teşekkürler Matt - önerilen değişikliğin beklendiği gibi çalışmasını sağlar. Yanlış gittiğim yerde, sözün içinde saklanmak için 'resol() işlevini beklemekteydi; ancak sadece 'o zaman()' araması sırasında tanımlandığı anlaşılmaktadır. –