gpt4 book ai didi

javascript - 为什么 'new Promise(...)' 返回 'undefined' ?

转载 作者:数据小太阳 更新时间:2023-10-29 04:38:28 27 4
gpt4 key购买 nike

似乎如果在用于创建 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)});

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

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 来自您在实例化新 promise 时创建的函数:

return new Promise(function(resolve, reject) {

通过注释掉该行并使用替代函数,您将调用正确的 resolve(),这将导致所需的输出。解决此问题的一种方法是将 resolve 函数传递到您的超时调用中,例如:

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

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


您的标题询问为什么 new Promise 返回未定义,而事实并非如此。它确实返回了一个有效的 promise 。只是 resolve 不是 promise 对象上的有效函数。

关于javascript - 为什么 'new Promise(...)' 返回 'undefined' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32065202/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com