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

本机JSpromise重试包装器

魏安然
2023-03-14
    {id:123459876, code:"frog"}
    [{value:"water", contents:0}]
    null
function makeRequest(reqMethod, navURL) {
    return new Promise(function (resolve, reject) {
        GM_xmlhttpRequest({
            method: reqMethod,
            url:    navURL,
            onload: function () {
                if (this.status >= 200 && this.status < 300) {
                    resolve(this.response);
                } else {
                    reject({
                        status: this.status,
                        statusText: this.statusText
                    });
                }
            },
            onprogress: function(event) {
                console.log(`Loaded ${event.loaded} of ${event.total}`);
            },
            onerror: function(data) {
                reject({
                    status: this.status,
                    statusText: this.statusText
                });
            }
        });
    });
}
    function makeRequestWrapper(requestMethod, navToURL, successFunction) {
        makeRequest(requestMethod, navToURL)
            .then(
                function (datums) {
                    successFunction(datums);
                }
            )
            .catch(
                function (err) {
                    console.error('there was an error!', err.statusText);
                }
            );
    }
// one of the 3 example handler methods for dealing with the success + JSON
    function successHandler1(jsonDataResponse) {
        let response = JSON.parse(jsonDataResponse);
        let id = response[0].id;
        let updateLink = document.getElementById("unique_link_id").parentNode.parentNode;
        updateLink .innerHTML += ` ID: ${id} `;
    }

然而,我的问题是,提取此JSON数据的脚本的一些用户将使Promise失败(一些用户比其他用户更频繁)--因此,我尝试的下一步分流是重试Promise一定次数,并且有延迟。这样,我想重试一个失败的promise,比方说3次,延迟3秒,应该会给你足够的尝试和时间来提高promise的成功率。

我的想法

因为我对JS相对来说是个新手(还在学习它,希望成为一门我可以在生活中使用的语言),我读过像promise和观察到的东西?并重新考虑我是否在正确的道路上解决这个问题。我想我需要一个深入的例子,具体到我的用例,并有一步一步的详细解释,以便不仅了解promise,而且了解这个用例场景。

    null
  • 在Node.js中使用Promise的重试模式
  • JavaScript:promise和为什么Async/Await赢得这场战斗
  • 重试JavaScript的同步/异步(promise)函数

我也看过无数的医生,比如;

  • https://developer.mozilla.org/en-美国/docs/web/api/
  • https://wiki.greasespot.net/
  • https://javascript.info/
  • https://devdocs.io/javascript/
    null

共有1个答案

何辰沛
2023-03-14

下面是围绕makerequest()函数的包装器,它允许传递最大重试次数和重试之间的延迟。它返回一个promise,如果成功就会解决,如果在MaxRetris之后仍然有错误就会拒绝。

function makeRequestRetry(requestMethod, navToURL, maxRetry = 3, retryDelay = 3000) {
    let retryCnt = 0;

    function delay(t) {
        return new Promise(resolve => {
            setTimeout(resolve, t);
        });
    }
    
    function run() {
        return makeRequest(requestMethod, navToURL).catch(function (err) {
            ++retryCnt;
            if (retryCnt > maxRetry) {
                console.error('Max retries exceeded. There was an error!', err.statusText);
                throw err;
            }
            console.error('Retry #' + retryCnt + ' after error', err.statusText);
            // call ourselves again after a short delay to do the retry
            // add to the promise chain so still linked to the originally returned promise
            return delay(retryDelay).then(run);
        });
        
    }
    return run();
}

人们会这样称呼它:

makeRquestRetry('GET', someURL, 5, 5000).then(result => {
    console.log(result);
}).catch(err => {
    console.log(err);
});

或者,使用重试参数的默认值:

makeRquestRetry('GET', someURL).then(result => {
    console.log(result);
}).catch(err => {
    console.log(err);
});
 类似资料:
  • 问题内容: 我从一些现有的wsdl中生成了一些WebServices 我使用Maven来做到这一点,但是某些Web服务是通过 和其他人 Jaxb或xjc会自动执行吗?因为我在wsdls中没有任何区别… 问题答案: 当“操作”名称,“消息”名称和“元素”名称在某种形状或形式上不同时,就会生成BARE Web服务。要自动将您的客户端或服务存根生成为WRAPPED,这三个元素都必须相同。 解决方法是编写

  • 上下文: 我正在使用spring-retry重试restTemplate调用。 restTemplate调用是从kafka侦听器调用的。kafka侦听器还被配置为在出错时重试(如果在过程中抛出任何异常,而不仅仅是restTemplate调用)。 目标: 当错误来自已耗尽的重试模板时,我想防止kafka重试。 实际行为: 当retryTemplate用尽所有重试时,将引发原始异常。从而阻止我识别Re

  • 在android Studio上使用flutter构建我的应用程序,当我上传我的应用程序包(通过制作时,会弹出消息: 我已经尝试了目前在线的所有解决方案来解决这个问题。以下各项的每种组合: 这些解决方案: https://github.com/flutter/flutter/issues/60240#issuecomment-894683946 https://github.com/flutter

  • 本机安装Sonarqube 下载 钉盘 - 网聚宝开发指南-资源 - Common 将Sonarqube.6.2.zip 下载到本机并解压。 安装mysql 去 钉盘 - 网聚宝开发指南-资源 根据你的系统下载对应 MySQL 安装包。 点开进行安装,记住安装好的时候 弹出的root 的密码。 进入系统偏好设置,点击mysql,开启mysql服务。 此时我们在命令行输入mysql -uroot -

  • 有没有隐藏iOS键盘的简单方法?我想把它封闭在一些特定的场景中,这些场景不一定需要关注另一个视角。i、 e.像服务器的特定响应。

  • 我需要将targetSdkVersion和所有依赖项更新到版本25,并将JAVA_HOME设置为JDK1.8。谢谢,阿比谢克·雅利安

  • Gem安装bundler给我这个错误。 错误:找不到有效的宝石bundler( 解决办法是什么?

  • 整数包装类 我无法理解这种输出是如何形成的。我想了解这个整数中的“1000”是如何转换成字节中的“-24”的。我想知道这背后的逻辑。