超时并不总是触发JQuery延迟

时间:2018-02-20 20:01:59

标签: javascript jquery settimeout deferred event-loop

我有这个例子,我需要使用JQuery延迟并需要等待API调用来获取一些数据但是如果API响应需要太长时间,我正在设置超时并解决(未定义)。

在这段代码中工作正常但是在1%的会话中我看到API调用花费的时间超过“超时”但是超时没有触发并且没有解析(未定义)并且等待API响应时间。这1%发生在不同的浏览器上。

知道为什么会这样吗?

感谢您的提前帮助

以下是代码:

public static setup(setupUrl: string, configOptions: IDefaultConfigOptions, timeout: number): JQueryPromise<string> {
            const setupPromise = $.Deferred<string>();
            this.startDefaultSetup(setupInUrl, configOptions, timeout, setupPromise);
            return setupPromise;
        }

private static startDefaultSetup(setupUrl: string, configOptions: IDefaultConfigOptions, timeout: number, setupPromise: JQueryDeferred<string>): void {
    let setupPromiseResolved = false;

    // Set timeout for setup
    let setupTimeout = setTimeout(() => {
        if (!setupPromiseResolved) {
            setupPromiseResolved = true;
            setupTimeout = undefined;
            setupPromise.resolve(undefined);
        }
    }, timeout);

    // this function calls api and has this defaultSetupResult callback
    getAccount(configOptions, defaultSetupResult => {
        if (!setupPromiseResolved) {
            setupPromiseResolved = true;
            if (setupTimeout) {
                clearTimeout(setupTimeout);
                setupTimeout = null;
            }
            this.handleSetupResult(defaultSetupResult, setupUrl, setupPromise);
        }
    });
}

1 个答案:

答案 0 :(得分:0)

我试图找到解决同类问题的方法。我读过有关承诺的文章。基本上,函数将等待结果并处理到下一个。下面的代码片段将为您提供我的意思的基本指示:

<script>
    $( "button" ).on( "click", function() {
      $( "p" ).append( "Started..." );

      $( "div" ).each(function( i ) {
        $( this ).fadeIn().fadeOut( 1000 * ( i + 1 ) );
      });

      $( "div" ).promise().done(function() {
        $( "p" ).append( " Finished! " );
      });
    });
</script>

对于将来的参考,请使用下面的链接或谷歌。祝你好运

JQuery promise()