如何解决布尔变更的承诺?

时间:2020-07-09 20:46:30

标签: javascript

我的目标是实现以下目标:

  1. 将EventListener添加到按钮上,然后单击它将将全局变量isClicked更改为true
  2. isClicked设置为True时,运行return getCheckedBoxes("checkboxes");,它将仅获取已选中的复选框

仅此而已!问题是我正在从Python脚本调用此脚本,因此我需要使用await阻止Python脚本运行。我不太了解JS,但我设法做到了以下几点:

var isClicked = false;

document.getElementById("btn-id").addEventListener("click", function () {
    document.getElementById("modal").style.display = "none";
    isClicked = true;
});

function getCheckedBoxes(checkboxName) {
    var checkboxes = document.getElementsByName(checkboxName);
    var checkboxesChecked = [];

    for (var i = 0; i < checkboxes.length; i++) {
        if (checkboxes[i].checked) {
            checkboxesChecked.push(Number(checkboxes[i].id));
        }
    }

    return checkboxesChecked.length > 0 ? checkboxesChecked : null;
};

let promise = await new Promise((resolve, reject) => {
    if (isClicked == true)
    resolve(promise)
});

return getCheckedBoxes("checkboxes");

脚本在let promise = ...行上停止,这是一个好兆头。但是当isClicked设置为true时,我不知道如何解决承诺,以便脚本的其余部分可以(即,我可以运行return getCheckedBoxes("checkboxes");)。

2 个答案:

答案 0 :(得分:0)

您正在寻找的方法很不方便。您可以在调用回调时解决承诺,而不是解决布尔更改的承诺。

此答案确实假定代码位于async function中。请注意,返回值async function永远是新的承诺。

// the line below waits until the click callback is called
await new Promise(resolve => {
  document.getElementById("btn-id").addEventListener("click", function () {
    document.getElementById("modal").style.display = "none";
    resolve();
  });
});

var checkboxes = document.getElementsByName(checkboxName);
var checkboxesChecked = [];

for (var i = 0; i < checkboxes.length; i++) {
    if (checkboxes[i].checked) {
        checkboxesChecked.push(Number(checkboxes[i].id));
    }
}

return checkboxesChecked.length > 0 ? checkboxesChecked : null;

答案 1 :(得分:0)

您只能在异步函数中执行await,请确保在此处运行它。 而且您要检查一次isClicked是否为true,因此承诺将永远无法解决。

async function submitBox() {
    var submit;
    
    document.getElementById("btn-id").addEventListener("click", function () {
        document.getElementById("modal").style.display = "none";
        submit();
    });
    
    function getCheckedBoxes(checkboxName) {
        var checkboxes = document.getElementsByName(checkboxName);
        var checkboxesChecked = [];
    
        for (var i = 0; i < checkboxes.length; i++) {
            if (checkboxes[i].checked) {
                checkboxesChecked.push(Number(checkboxes[i].id));
            }
        }
    
        return checkboxesChecked.length > 0 ? checkboxesChecked : null;
    };
    
    let promise = await new Promise((resolve, reject) => {
        submit = resolve;
    });
    
    return getCheckedBoxes("checkboxes");
}