提问人:Alex Variance 提问时间:9/12/2022 更新时间:9/12/2022 访问量:76
异步 Javascript 和 promise
Asynchronous Javascript and promises
问:
我仍然是 JavaScript 的新手,还没有做过任何 Web 开发方面的实习或正式工作。
HTML 有 3 个单选按钮,h4 标签用于根据单选按钮选择显示一些文本/结果。
HTML格式:
<p>The 3 sages of the apocalypse</p>
<input id="cat" type="radio" name="3sages">
<label >Luceila of the South</label><br>
<input id="fav" type="radio" name="3sages">
<label >Isley of the North</label><br>
<input id="split" type="radio" name="3sages">
<label >Riful of the west</label><br>
<h4 id="display"></h4>
实验室要求是这样的,我必须使用 promise,当 promise 对象被拒绝时,必须进行不同的函数调用。Promise 很难理解,因为我上周用谷歌搜索了 2 个小时,无法理解。.then 有什么用途?它是否使用 promise 对象?
JavaScript(不起作用):
$('input[type=radio][name=3sages]').change(function()
{
function wrong()
{
const write = document.getElementById("display");
write.innerHTML = "Wrong";
}
function correct()
{
const write = document.getElementById("display");
write.innerHTML = "He is my favorite";
}
let guarantee = new Promise(function(resolve,reject) {
if ($('#fav').is(':checked'))
{
resolve(correct());
}
else
{
reject(wrong());
}
});
guarantee.then(
function()
{
correct();
},
function()
{
wrong();
}
);
});
答:
0赞
trincot
9/12/2022
#1
JavaScript(无法正常工作)
实际上,您的代码运行良好(但请继续阅读)。确保包含 jQuery,并且脚本在文档加载后执行 - 因此将脚本放在页面底部。下面是可运行代码段中的代码:
$('input[type=radio][name=3sages]').change(function()
{
function wrong()
{
const write = document.getElementById("display");
write.innerHTML = "Wrong";
}
function correct()
{
const write = document.getElementById("display");
write.innerHTML = "He is my favorite";
}
let guarantee = new Promise(function(resolve,reject) {
if ($('#fav').is(':checked'))
{
resolve(correct());
}
else
{
reject(wrong());
}
});
guarantee.then(
function()
{
correct();
},
function()
{
wrong();
}
);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>The 3 sages of the apocalypse</p>
<input id="cat" type="radio" name="3sages">
<label >Luceila of the South</label><br>
<input id="fav" type="radio" name="3sages">
<label >Isley of the North</label><br>
<input id="split" type="radio" name="3sages">
<label >Riful of the west</label><br>
<h4 id="display"></h4>
我必须使用承诺
老实说,在没有异步行为的情况下使用承诺是没有意义的。在代码中,承诺是在所有需要的信息都可用时创建的,并且没有异步等待。
如果这确实是预期的练习,那就这样吧,但如果你想寻找真正异步的东西,那么就要等待用户的输入。该部分是异步的 -- 您事先不知道用户何时会单击该单选按钮。这就是可以使用承诺的地方。这归结为对 jQuery 方法(或更一般地说,它的方法)的 promise 化。由于 promise 是关于捕获一个事件,并且事件侦听器会在每个重复事件上触发,因此您只需要侦听一个事件(使用 jQuery 的方法),然后在触发时为下一个事件的发生创建一个新 promise。.click
.on
.one
这是它的样子:
// Generic function to get a promise of a certain event on a selected element
function promiseEvent(selector, event) {
return new Promise(resolve => $(selector).one(event, resolve));
}
// Specific function to get a promise for the user selecting an answer
function promiseAnswer() {
return promiseEvent('input[type=radio][name=3sages]', 'change');
}
// Create the promise and listen for when it resolves
promiseAnswer().then(processChoice);
function processChoice() {
// React to the user's choice
$("#display").text(
$('#fav').is(':checked') ? "He is my favorite" : "Wrong"
);
// Create the promise again and listen when it resolves
promiseAnswer().then(processChoice);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>The 3 sages of the apocalypse</p>
<input id="cat" type="radio" name="3sages">
<label >Luceila of the South</label><br>
<input id="fav" type="radio" name="3sages">
<label >Isley of the North</label><br>
<input id="split" type="radio" name="3sages">
<label >Riful of the west</label><br>
<h4 id="display"></h4>
评论
0赞
Alex Variance
9/12/2022
我用 JSFiddle 做了一些交叉检查,正如你所说,我的代码有效。事实证明,我的chrome浏览器有一些问题。只会问我的导师出了什么问题。感谢您分享您的经历,以获得一些灵感和学习
0赞
Alex Variance
9/12/2022
刚刚添加了 $(document).ready( function() ...它适用于Chrome浏览器,FacePalm
0赞
trincot
9/12/2022
我是这么认为的。这就是为什么我建议把你的脚本放在页面底部。但也有效。但是,在 jQuery 最佳实践中,您将使用较短的 .不过,我还是更喜欢把脚本放在文档的末尾。ready
$(function()...
评论