gpt4 book ai didi

javascript - 递归 promise 没有解决

转载 作者:行者123 更新时间:2023-11-30 14:19:54 26 4
gpt4 key购买 nike

我有一个函数可以获取一些数据。如果数据不可用(短时间后可用),则返回 null。我创建了一个返回 promise 的函数,它围绕着获取数据并检查它是否可用的逻辑——如果不可用,它会调用自身:

Foo.prototype.fetchDataWrapper = function () {
return new Promise((resolve, reject) => {
const data = fetchData();
if (data) {
resolve(data)
} else {
setTimeout(() => {
return this.fetchDataWrapper()
}, 100)
}
})
}

问题是,尽管正确获取了数据,但这个 promise 永远不会解决。我做错了什么?

最佳答案

您的return this.fetchDataWrapper() 是从计时器回调 返回的,不是fetchDataWrapperfetchDataWrapper 已经返回。相反,将该 promise 传递给 resolve:

Foo.prototype.fetchDataWrapper = function () {
return new Promise((resolve, reject) => {
const data = fetchData();
if (data) {
resolve(data);
} else {
setTimeout(() => {
resolve(this.fetchDataWrapper()); // *****
}, 100);
}
})
};

当您将 promise 传递给resolve 时,它会根据您传递给它的 promise 使resolves 属于resolve 或reject .

(我还在该代码中添加了一些缺少的分号。我建议与分号保持一致:要么依赖 ASI,要么不依赖,都不要将两者混用。还建议不要依赖 ASI,但这是一种风格选择。)


旁注:在 X 次尝试后拒绝可能是有意义的,也许:

Foo.prototype.fetchDataWrapper = function (retries = 5) {
// *** Declare retries param with default -^^^^^^^^^^^
return new Promise((resolve, reject) => {
const data = fetchData();
if (data) {
resolve(data);
} else {
if (retries) { // *** Check it
setTimeout(() => {
resolve(this.fetchDataWrapper(retries - 1));
// *** Decrement and pass on -^^^^^^^^^^^
}, 100);
} else {
reject(); // *** Reject
}
}
})
};

关于javascript - 递归 promise 没有解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52942707/

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