javascript - 来自弹出窗口的异步 onClick 事件返回值
问题描述
EDIT2:我解决了这个问题,因为我怀疑我的整个方法是错误的。我通过使用 jQuery 创建第二个单独的事件来做到这一点,并在单击完成按钮时触发它
$(selector).click(() => {
Numpad.activate(document.getElementById(element));
});
$(selector).on("val-updated", (event, data) => {
SendData(name, data)
});
和完成功能:
done: () => {
$(selector).trigger("val-updated", val);
}
编辑:我的整个方法似乎是错误的,因为 done() 方法都附加到激活小键盘的按钮和完成按钮本身,但完成按钮本身不在打开小键盘的按钮的 onclick 事件中. done 事件将输入值设置为变量 Numpad.val,有没有办法仅在填充 Numpad.val 时从我的 .click 函数中运行第二行代码?有没有办法添加某种触发器来做到这一点?喜欢:
$("#someIdSelector").click(async () => {
// This should execute as soon as the button is clicked and it does
Numpad.activate(document.getElementById("#someIdSelector"));
// This should execute only after Numpad.val gets a new value
// which happens when the person clicks on the done button
// and that runs the Numpad.done() function, which sets the value of Numpad.val
SendData(name, Numpad.val);
});
我有一个基本上是数字键盘的弹出窗口,用户在其中输入一些数字并且它有一个“完成”按钮。
我有两个关于弹出窗口的功能(关于我的问题),我有一个激活功能和完成功能。
然后我有第三个函数将 onClick 代码附加到按钮,它处理小键盘的激活,它还应该从小键盘接收值。问题是这些操作中的一个是即时的,另一个不是。代码看起来像这样:
小键盘的功能:
Numpad: {
val: null,
activate: () => {
$("#btnTrigger").click();
},
done() {
return new Promise((resolve, reject) => {
Numpad.val = $("#easy-numpad-output").text();
$("#btnTrigger").click();
Numpad.clear();
resolve(Numpad.val);
});
}
在我的 onclick 函数中,这就是我猜测的问题所在:
$("#someIdSelector").click(async () => {
// This should execute as soon as the button is clicked and it does
Numpad.activate(document.getElementById("#someIdSelector"));
// This should execute only when Numpad.done() is resolved (when the user pressed done on the numpad)
SendData(name, await Numpad.done());
});
相反,当我单击一个按钮时,onclick 中的所有代码都会立即执行,当然此时 Numpad.done() 是未定义的。我也尝试使用 .then,但是只要我按下一个按钮,console.log("Inside promise resolve") 就会立即被调用:
$("#someIdSelector").click(async () => {
// This should execute as soon as the button is clicked and it does
Numpad.activate(document.getElementById("#someIdSelector"));
// This should execute only when Numpad.done() is resolved (when the user pressed done on the numpad)
Numpad.done().then((data) => {
console.log("Inside promise resolve");
SendData(name, data);
});
});
解决方案
当您将方法声明为时,一旦第一个被命中async
,它就会隐式返回 a 。Promise
await
您的done
方法不包含任何await
语句,因此它会立即返回Promise
已解析的 a,其结果是您的 unresolved Promise
。
如果您要Promise
手动返回,请删除async
关键字;这样,Promise
当您await Numpad.done()
.
推荐阅读
- php - 无法在“a href”链接中传递带撇号的变量
- excel - 如何根据翻译列表用中文字符替换列中的单元格?
- bash - 如何通过 xargs 将多个查询参数传递到 httpie?
- c - 它是可移植的编译库吗?
- typescript - 确保对象将每个枚举值作为键(Typescript)?
- python - pip安装后找不到python模块
- python-3.x - 如何修复烧瓶中的'TypeError:'module'对象不可调用'?
- hugo - 如何在 Hugo 的 [permalinks] 部分中使用自定义参数?
- c# - 通过使用代理 API 将多个文件上传到 Sharepoint 2013 以验证文件上传过程(使用 vti_bin/copy.asmx)
- c++ - 我找不到在同一编译屏幕上与线程同时运行此计数器 3 次的方法