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

等待循环中的响应[重复]

边霄
2023-03-14

我有一个endpoint生成一些数据(需要一些时间),另一个endpoint可以用来获取生成的数据。我用wait调用第一个,从响应中获取id,并想调用第二个,而它的状态不是“Success”(它表示响应中准备和存储的数据),并继续我的脚本。

这是我的代码

let data = ['foo', 'bar']
let res = await client.post('ninbexec/v2/executions', data)
let result_id = res.data[0].id
while (true) {
        let resp = await client.get(`ninbexec/v2/executions/${result_id}`)

        if (resp.data.status === 'SUCCEEDED') {
            response = JSON.parse(resp.data.result.dataset)
            break;
        }
    }

它的工作,但我赢得了这么多的请求,我如何设置一些请求的间隔?我尝试使用await setInterval(),但是代码继续执行,没有等待结果

e、 g.我也使用axios,如果它有一些芭蕾舞技巧,它会更好

共有1个答案

岳出野
2023-03-14

在这种情况下,您不想使用<code>setInterval</code>来实现。您想使用<code>设置超时。

您不能将 setTimeoutawait 一起使用,因为它不会返回 Promise。

这是一个旧的API,它使用回调样式,如下所示:

setTimeout(() => console.log('do something after 1000 ms'), 1000)

如果要使用 await 语法,这不是很方便。

您可以做的是“promisizing”setTimeout函数,这意味着创建另一个基于Promise的函数版本。

听起来很花哨,但实际上很容易做到,下面是一个例子:

function pSetTimeout(timeout){
  return new Promise((resolve) => {
    setTimeout(() => resolve(), timeout)
  })
}

它只是将对< code>setTimeout的调用包装在一个promise中,并在调用回调时调用< code>resolve。

所以你的整个代码看起来像这样:

let data = ['foo', 'bar']
let res = await client.post('ninbexec/v2/executions', data)
let result_id = res.data[0].id
while (true) {
    
    let resp = await client.get(`ninbexec/v2/executions/${result_id}`)

    if (resp.data.status === 'SUCCEEDED') {
        response = JSON.parse(resp.data.result.dataset)
        break;
    }
    await pSetTimeout(10000) // for exemple, wait for 10 seconds
}

请确保您完全了解什么是基于 Promise 的函数以及旧回调函数样式之间的区别。

 类似资料:
  • 问题内容: 我正在使用bluebird,方法 getAll 和 update return promises。我如何说“等到两个承诺返回,然后更新currentProduct值”?我对JS很陌生… 问题答案: 如果可以使用/,这将很简单。 或者,如果您只能使用简单的承诺,则可以遍历所有产品,并将每个承诺置于最后一个循环中。这样,仅当前一个问题解决时,它才会前进到下一个问题(即使它将首先迭代整个循环

  • 问题内容: 我的页面运行着一系列命令,这些命令迫使我的PHP脚本停止更改,直到收到响应为止。我如何知道不要等待响应而只运行命令? 我正在使用一个具有后端系统的复杂命令,我可以查询该命令以检查状态,因此我不关心响应。 问题答案: 取决于您使用的平台和运行的命令。 例如,在Unix / Linux上,您可以在命令末尾追加命令,以告诉Shell释放您已启动的进程,exec将立即返回。这在Windows上

  • 本文向大家介绍JavaScript 异步等待循环,包括了JavaScript 异步等待循环的使用技巧和注意事项,需要的朋友参考一下 示例 在循环中使用异步等待时,您可能会遇到其中一些问题。 如果您只是尝试在内部使用await forEach,则会抛出Unexpected token错误。 这是因为您错误地将箭头功能视为一个块。该await会在回调函数,这是不是上下文async。 解释器可以防止我们

  • 我试图制作一个简单的应用程序来学习c(Visual Studio)中的一些东西。现在我正在制作一个音乐播放器,其中一个动作是在按钮点击事件中淡出音乐。 我对构建淡出部分没有问题,我做了一个while循环,每次循环运行时都将音量降低1%。此外,我还使用淡入度值更新标签。 唯一的问题是,为了减缓褪色,我正在使用线程。睡眠事件,该部分将冻结我的应用程序,并阻止使用淡入淡出值对我的文本标签进行任何更新。

  • 问题内容: 我有一个页面,使用被称为100次(async:true)的jQuery.ajax,问题是,当它们都被加载时,我需要系统等待所有100次调用返回后才能继续。我将如何处理? 提前致谢!:) 更新: 这些调用在for()循环中进行(其中有100个:) 问题答案: 最好的方法是使用。您可以按以下方式使用它: 另外,如果您在数组中拥有所有AJAX调用,则可以使用: 请注意,这至少需要jQuery

  • 我有一个项目,我需要使用一个站点从中获取数据。所以事情是这样的:使用htmlUnit我用我的数据填充文本框,然后我按下锚,它使用ajax下载我需要的内容并动态更改超文本标记语言页面,在模态窗口中显示内容。但是在我使用锚上的. Click()后,我得到了相同的页面,没有更新,在寻找解决方案后,我在网络上发现了这个: HtmlUnit将执行Ajax调用并更新页面。请注意,与常规页面加载不同,Click