gpt4 book ai didi

javascript - 使用异步函数等待来自 onclick 的用户输入

转载 作者:行者123 更新时间:2023-11-29 20:52:07 25 4
gpt4 key购买 nike

我是 async 的新手,可能只是没有深入了解基础知识,但我正在尝试通过调用弹出模式并等待用户提交数据的异步函数来等待来自 onclick 的用户输入。在只找到一两个甚至提到使用异步等待对我的特定任务没有特别帮助的页面事件的来源之后......我想到了这个:

asnyc func1 (){
var userInput = await async2();

//do stuff with user input
}
async func2(){
//build modal content specific to task
//display modal
return new Promise(function(resolve,reject){
$(document).on('click', '#save-input', function(e){
var input = $('#input-data').val();
resolve(input);
});
});
}

一切似乎都正确调用并且我得到了用户输入,但 func1 永远不会继续调用 async2。所以很明显,我遗漏了其中的一些关键方面,但我似乎无法从我的资源中提取它。

回调不是一个选项,这里的代码还有很多我无法简述的内容,但上面描述的是我需要执行的基本功能。

最佳答案

简单片段

const timeout = async ms => new Promise(res => setTimeout(res, ms));
let next = false; // this is to be changed on user input

async function waitUserInput() {
while (next === false) await timeout(50); // pauses script
next = false; // reset var
}

使用 jQuery 的示例:

// just change the value of `next` for the script to continue
$('#user-input').click(() => next = true);

async function myFunc() {
// do stuff before
await waitUserInput(); // wait until user clicks
// do stuff after
}

myFunc() // launch function and start waiting for user input

请看这个工作演示

// this is an async timeout util
const timeout = async ms => new Promise(res => setTimeout(res, ms));

let next = false; // this is to be changed on user input
let n = 1;

async function waitUserInput() {
while (next === false) await timeout(50); // pause script but avoid browser to freeze ;)
next = false; // reset var
}

async function myFunc() {
$('#text').append(`* waiting user input...<br>`)
await waitUserInput();
$('#text').append(`* user has clicked ${n++} time(s)<br>`)
myFunc()
}

$('#user-input').click(() => next = true)

myFunc()
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id='user-input' style='padding:15px;color:white; background: tomato; border: 0; border-radius:8px; font-weight: bold'>CLICK ME !</button>
<div id='text'>
</div>


进一步改进

这个示例可以很容易地改进以满足您的需求。例如,变量 next 也可用于存储用户输入值,而 waitUserInput 返回该值。这将导致编写如下内容:

const userResponse = await waitUserInput(); // get user input value

// this is an async timeout util
const timeout = async ms => new Promise(res => setTimeout(res, ms));

let next = false; // this is to be changed on user input

async function waitUserInput() {
while (next === false) await timeout(50); // pause script but avoid browser to freeze ;)
const userInputVal = next;
next = false; // reset var
return userInputVal;
}

async function myFunc() {
$('#text').append(`* waiting user input...<br>`)
const userResponse = await waitUserInput();
$('#text').append(`* user choice is ${userResponse}<br>`)
myFunc()
}

$('#user-input').click(function() { next = $('#text-input').val() })

myFunc()
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id='text-input' type='text'/>
<button id='user-input' style='padding:15px;color:white; background: tomato; border: 0; border-radius:8px; font-weight: bold'>SUBMIT !</button>
<div id='text'>
</div>

关于javascript - 使用异步函数等待来自 onclick 的用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51374649/

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