当前位置: 首页 > 知识库问答 >
问题:

设置间隔并等待特定条件

况庆
2023-03-14

我试图做的事情在节点js中可能是不可能的,但在我放弃之前,我想得到其他意见。

我有一个线程正在执行产品的设置。为了便于论证,让我们将其称为“主”线程。我希望在产品设置过程中可能发生的所有错误都被“主”线程捕获。如果安装成功,那么在我知道安装成功之前,我不希望“主”线程完成。

产品设置过程中的一个步骤涉及在客户的AWS帐户中创建CloudFormation堆栈。实现这一点的AWS函数是createStack。此函数仅启动创建堆栈的过程。如果使用await调用此函数,那么在获得返回值后,创建堆栈的过程仍将运行。

还有一个AWS CloudFormation函数叫做DescribeBacks,我可以用它来了解创建过程。我不能重复调用这个方法(在调用之间不使用较大的间隔),因为AWS限制了我调用方法的频率。

我希望能够每分钟调用此函数一次,以检查堆栈创建的进度,直到我可以确定安装是否成功。但至关重要的是,我还希望“主”线程等到这一成功或失败发生。

这在节点js中可能吗?我是节点js的新手。请随时告诉我,我误用了它,并且我以错误的方式思考问题。我怀疑我是。

解决方案:这是为我解决问题的代码。多亏了Tomalak

function checkStackCreationProgress(params) {
    return new Promise( (resolve, reject) => {
        const intervalId = setInterval( async () => {
            try {
                const result = await checkProgress(params);

                switch(result.status) {
                    case 'IN_PROGRESS': break; //do nothing
                    case 'COMPLETE': clearInterval(intervalId); resolve(result); break;
                    case 'FAILED': clearInterval(intervalId); reject(result); break;
                }
            }
            catch(error) {
                clearInterval(intervalId);
                reject(error);
            }
        },
        60000);
    })
    .then( () => {
        return;
    })
    .catch(error => {
        throw new SetupFailedError(`Failed to create ...`, error);
    });
}

在安装成功完成或失败之前,此函数不会返回

共有1个答案

宦高岑
2023-03-14

如果使用await调用此函数,那么在获得返回值后,创建堆栈的过程仍将运行。

不要用wait调用它,这会阻塞线程。

异步函数返回promise,您可以链接它们,同时做其他事情。

因此

try {
    var result = await createStack({some: params));
    // work with result
} catch (ex) {
    // handle error
}

createStack({some: params)).then(function (result) {
    // work with result
}).catch(function (error) {
    // handle error
});

第二种形式是非阻塞的,你可以同时做任何工作。例如:

var checking = setInterval(function () {
    // check/output for the stack status...
}, 60000)

createStack({some: params)).then(function (result) {
    clearInterval(checking);

    // work with result
}).catch(function (error) {
    clearInterval(checking);

    // handle error
});

console.log("Stack is being created, hang on...");
 类似资料:
  • 我正在寻找更优雅的方式在测试期间刷新网页(我使用Selenium2)。我只是发送F5键,但我想知道驱动程序是否有刷新整个网页的方法。这是我的代码 对于在手动刷新的页面上查找元素,可能有更好的解决方案

  • 问题内容: 我正在寻找一种更优雅的方法来在测试过程中刷新网页(我使用Selenium2)。我只是发送F5键,但我想知道驱动程序是否具有刷新整个网页的方法,这是我的代码 也许是在手动刷新的页面上查找元素的更好的解决方案 问题答案: 在Java或JavaScript中: 这应该刷新页面。

  • 我第一次做硒测试。在主页上,我调用了一些AJAX,我希望Selenium等待元素加载完成。我不确定它是否有效,但我只是键入selenium,waitForCondition可以选择。 无论我选择什么,它总是返回“false”。我现在连等待条件都不工作吗? 我如何测试它是否有效?在这些代码中我做错了什么? 如果由自己的类实现,则返回“true” isElementPresent(By.xpath(“

  • 之前介绍过的所有阻塞调用,将会阻塞一段不确定的时间,将线程挂起直到等待的事件发生。在很多情况下,这样的方式很不错,但是在其他一些情况下,你就需要限制一下线程等待的时间了。这允许你发送一些类似“我还存活”的信息,无论是对交互式用户,或是其他进程,亦或当用户放弃等待,你可以按下“取消”键直接终止等待。 介绍两种可能是你希望指定的超时方式:一种是“时延”的超时方式,另一种是“绝对”超时方式。第一种方式,

  • 如果吊舱已经处于状态,我还希望命令立即返回。但这不会发生。 kubectl wait不是我要找的命令吗?

  • 我正在为以下问题而苦苦挣扎:我的javafx应用程序中有一个类似弹出窗口的东西,它应该阻止应用程序,直到用户输入一些。它不是一个单独的阶段,我可以在其中调用showAndWait(),然后返回阶段的输入。弹出窗口实现为窗格,该窗格放置在其他组件之上。现在我做这样的事情: 所以我希望pp.getInput()等待,直到用户按OK/CANCEL/APPLY/...按钮在我的弹出窗口中。在这种情况下,我