JavaScript ES6 承诺在 while 循环中调用异步操作

javascript es6 promise to call async actions in while loop

本文关键字:调用 异步操作 循环 while ES6 承诺 JavaScript      更新时间:2023-09-26

我有一个函数,如下所示:

function callApi(url){
    return fetch(url).then(response => {return response.json()}
       ).then(response => {return response})
}
function myFunction() {
    var status = null;
    while (status != "complete") {
        setTimeout(function(){
            callApi('myurl').then(response => {
               status = response.status
            }
         }, 5000)
    }

在这里,我只想检查我是否从 api 调用中获取所需状态。

直到我从 api 调用中获得所需的状态,我想每 5 秒检查一次。

但这行不通。我已经用谷歌搜索过,但根据我的需要不理解解决方案。如果有人能回答这个问题,那将非常有帮助。

我是javascript的新手。我已经看过es6承诺。如果有人能解释这一点,那就太好

了..

谢谢

把这个帮助程序放在你所有的脚本中:

var wait = ms => new Promise(resolve => setTimeout(resolve, ms));

然后永远不要再调用setTimeout(它具有可怕的错误处理特征)。

此外,while是一个同步构造,在这里不起作用。您可以使用异步"递归"。此外,要对异步操作进行排序,必须链接承诺:

function myFunction() {
  return callApi('myurl').then(response =>
    response.status == "complete" ? response : wait(5000).then(() => myFunction()));
}

当前代码有一些拼写错误(thenmyFunction缺少闭合小板)和一个很大的缺陷。

setTimeout 不是阻塞函数,因此您在 while 循环中运行的次数比您想象的要多。您正在创建很多将在 5 秒后执行的"稍后函数"。

现在,您的代码流就是这样做的。

  1. 而。。。
  2. 创建一个函数,但现在不要运行它...
  3. 回到同时...

第 2 行甚至在前 5 秒通过之前就会运行数千次。

这是您的代码,没有拼写错误,但主要问题仍然存在。

function myFunction()
{
    var status = null;
    while (status != "complete")
    {
        setTimeout(function()
        {
            callApi('myurl').then(response => { status = response.status }); //<-- missing ')'
        }, 5000);
    }
}

至于主要问题,你不应该编写每X秒检查一次的代码,如果发生了什么事,你应该使用Promise API并向done事件添加一个函数。这样,只有当异步函数中的前一个代码被芬兰化时,您所需的代码才会运行。