为什么'新Promise(…)'返回'undefined'?

看起来如果在用于创build一个promise的函数中没有引用'resolve'函数,那么promise就是未定义的。 在下面的代码中,…

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

试图做出创造诺言的function之外的决心,结果是:

 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) 

但是,如果第16行被注释掉,第18-20行没有注释,则输出为:

 Resolved with count 1 

..这是我所期望的。 我错过了什么? 这是在Windows 7上使用nodejs v0.12.2,如果这有什么不同。

这是因为这一行:

 thePromise.resolve(_count); 

该对象上没有resolve函数。 resolve来自您在实例化新承诺时创build的function:

 return new Promise(function(resolve, reject) { 

通过注释掉这一行,并使用备用函数,您正在调用正确的resolve() ,这将导致所需的输出。 一个解决这个问题的方法是将parsing函数传递给你的超时调用,例如:

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

虽然我不确定你为什么要这样做。


你的标题问为什么new Promise返回undefined,当事实是,它不是。 这确实正在回复一个有效的承诺。 这只是resolve不是承诺对象上的有效函数。