javascript es6承诺在while循环中调用异步操作

时间:2016-03-01 11:55:46

标签: javascript ecmascript-6 es6-promise

我的功能如下:

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电话中获得了所需的状态。

直到我想要每隔5秒检查一次的api电话获得所需的状态..

但这不起作用.. 我根据自己的需要用谷歌搜索但不理解解决方案。 如果有人能回答这个问题会非常有帮助。

我是javascript的新手。我看过es6承诺的某个地方。 如果有人能够解释这一点,那将是非常好的。

谢谢

2 个答案:

答案 0 :(得分:1)

将此助手放在所有脚本中:

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

然后再也不会再调用setTimeout(它具有可怕的错误处理特性)。

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

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

答案 1 :(得分:0)

当前代码有一些拼写错误(thenmyFunction上缺少关闭braclets)和一个大缺陷。

setTimeout不是阻止函数,因此您在while循环中运行的次数比您想象的多。 你正在创造很多以后的功能'这将在5秒后执行。

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

  1. WHILE ......
  2. 创造一个功能,但现在不能运转......
  3. 返回时间......
  4. 第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事件添加一个函数。 这样,只有当asyncronous函数中的前一个代码完成时,您所需的代码才会运行。