为什么'新承诺(...)'返回'未定义'?

Pet*_*ler 7 javascript node.js promise

似乎如果在用于创建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)});
Run Code Online (Sandbox Code Playgroud)

尝试在创建promise的函数之外执行解析,导致:

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)
Run Code Online (Sandbox Code Playgroud)

但是如果第16行被注释掉并且第18-20行被取消注释,则输出为:

Resolved with count 1
Run Code Online (Sandbox Code Playgroud)

..这是我的预期.我错过了什么?这是在Windows 7上使用nodejs v0.12.2,如果这有任何区别.

Mat*_*Way 8

这是因为这条线:

thePromise.resolve(_count);
Run Code Online (Sandbox Code Playgroud)

resolve该对象没有任何功能.resolve来自实例化新承诺时创建的函数:

return new Promise(function(resolve, reject) {
Run Code Online (Sandbox Code Playgroud)

通过注释掉该行,并使用备用函数,您调用正确的resolve(),这将导致所需的输出.修复此问题的一个选项可能是将resolve函数传递给超时调用,例如:

function timeout(resolve, _count) {
    resolve(_count);
}
Run Code Online (Sandbox Code Playgroud)

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


你的标题询问为什么new Promise返回undefined,而事实是它不是.它确实返回了一个有效的承诺.这只是resolve对promise对象的有效函数.

  • 谢谢马特 - 您建议的更改使其按预期工作.我认为我出错的地方是希望`resolve()`函数存储在promise中; 但它似乎只在调用`then()`时定义. (4认同)