承诺解决不了问题
Promise resolve will not fire
我想知道为什么这不会注销解决.then
方法。我们的想法是注销每次失败,然后一旦值匹配,注销.then
方法中的"Winner Winner"。
var winner = 5;
var ticket = 0;
var roll = function() {
ticket = Math.round(Math.random() * 10);
}
var play = function() {
roll();
return new Promise(function(resolve, reject) {
if (ticket === winner) {
resolve();
} else {
console.log("Sorry Try Again");
play();
}
});
}
play().then(function() {
console.log("Winner Winner!")
});
您只在第一个play()
成功时记录赢家,而不是递归的。添加.then()
var winner = 5;
var ticket = 0;
var roll = function() {
ticket = Math.round(Math.random() * 10);
}
var play = function() {
roll();
return new Promise(function(resolve, reject) {
if (ticket === winner) {
resolve();
} else {
console.log("Sorry Try Again");
play().then(function() {
console.log("Winner Winner");
});
}
});
}
play().then(function() {
console.log("Winner Winner!")
});
如果你不想在两个地方重复这些代码,定义一个函数来完成它。
var winner = 5;
var ticket = 0;
var roll = function() {
ticket = Math.round(Math.random() * 10);
}
var play = function() {
roll();
return new Promise(function(resolve, reject) {
if (ticket === winner) {
resolve();
} else {
console.log("Sorry Try Again");
playtest();
}
});
}
function playtest() {
play().then(function() {
console.log("Winner Winner!")
});
}
playtest();
如果您想避免too much recursion
(即使在如此小的随机范围内也可能发生),您可以这样做
var retry = function retry(fn) {
return fn().catch(function () {
return retry(fn);
});
};
var winner = 5;
var ticket = 0;
var roll = function roll() {
ticket = Math.round(Math.random() * 10);
};
var play = function play() {
roll();
return new Promise(function (resolve, reject) {
if (ticket === winner) {
resolve();
} else {
console.log("Sorry Try Again");
reject();
}
});
};
retry(play).then(function () {
console.log('winner');
});
然而! !最简单的修复方法是:
var winner = 5;
var ticket = 0;
var roll = function() {
ticket = Math.round(Math.random() * 10);
}
var play = function() {
roll();
return new Promise(function(resolve, reject) {
if (ticket === winner) {
resolve();
} else {
console.log("Sorry Try Again");
// setTimeout to avoid recursion
setTimeout(function() {
resolve(play());
}, 0);
// OR use Promise.resolve().then to asynchify the call to play so as to also avoid recusrion
Promise.resolve().then(function() {
resolve(play());
});
}
});
}
play().then(function() {
console.log("Winner Winner!")
});
而不是再次调用play,您resolve(play())
-这样做也可能导致too much recursion
。
要克服递归问题,只需将resolve(play())
包装在setTimeout 或 Promise.resolve().then(function() { ... });
中,如代码所示(使用一个或另一个,而不是两个:p)
相关文章:
- 如何解决Yii中的页面刷新问题
- 简单的ES6承诺问题-交换解决和拒绝参数
- 为什么不'我的窗口滚动事件根本没有启动.其他答案没有解决问题
- jQuery通过步骤的自排队循环来解决延迟问题
- 我该如何解决这个问题?“未捕获的类型错误:无法读取 null 的属性'appendChild'”
- MathJax正在复制我的方程式——为什么以及如何解决这个问题
- JS驱动的常见问题页面的推荐DB解决方案
- 如何解决youtube播放器没有显示全宽的问题&身高
- 我该如何解决这个问题;参考网格”;在JavaScript中完成的对象数
- 在我的案例中,如何解决我的承诺问题
- 解决从 1.0.5 升级到 angularjs 1.3 时出现的问题
- Google 日历 API V3 会解决与会者和创建者 Java 脚本问题
- 如何在窗体中使用多个按钮解决验证问题
- 当服务器从 http 更改为 https 时,有哪些可能的方法可以解决问题
- .attr(“href”) 的问题!解决此问题的简单方法
- 你能帮忙解决这个逻辑问题吗?
- 如何在 JavaScript for D3.js 中解决这样的范围问题
- TypeError:$(..).higharts不是函数-现有解决方案不起作用-Yeoman生成器存在问题
- 投票系统大拇指向上和向下的问题解决
- Iframe滚动问题.解决方案是什么