【问题标题】:How to retry try statement on Node properly?如何正确重试 Node 上的 try 语句?
【发布时间】:2016-11-27 19:43:41
【问题描述】:

这是我的原始代码,基本上它会尝试接受“交易报价”,如果失败,则会被拒绝。如何让它在同一“交易报价”上重试此语句 10 次,间隔为几秒钟,如果之后仍然失败,则拒绝报价?

try {
    offers.acceptOffer({tradeOfferId: offer.tradeofferid}, function(err, log) {
        if (err) { 
            helper.log('Error accepting trade offer ' + offer.tradeofferid, 891, err);
            offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
                currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
            });     
            return;
        }

【问题讨论】:

  • 因为它是异步的:递归。请注意,try/catch 无论如何都不起作用。

标签: javascript node.js node-modules steam


【解决方案1】:

回调中带有setTimeout() 的东西。一个 promise 甚至 ES2017 async-await (babel, TypeScript) 可以帮助你获得更简洁的代码。此外,由于错误会在回调中传播,因此无需使用 try 块,除非您使用的 api 可能会立即失败,但通常不会采用回调传递方式。

function putOffer(maxRetries) {
    offers.acceptOffer({tradeOfferId: offer.tradeofferid}, function(err, log) {
        if (err) { 
            if (maxRetries > 0) {
                setTimeout(function () { putOffer(maxRetries - 1); }, 2000);
                return;
            }
            helper.log('Error accepting trade offer ' + offer.tradeofferid, 891, err);
            ...
            return;
        }
    });
}

putOffer(10);

【讨论】:

  • 感谢您的回答,很抱歉我的问题,但是如果我像您发布的那样将我的声明从“尝试”更改为“功能”,这会对我的代码产生不良影响吗?以后在我的代码中也会出现“catch”语句
  • try/catch 通常只捕获代码中的错误,例如设置为未声明的变量。在异步代码中通常不需要它。除非您自己喜欢执行验证和throw,否则在您的代码中尝试捕获是非常罕见的。我会说看看 api 看看它是否可以抛出。无论哪种方式,您都需要在 catch 子句中做一些有用的事情。否则你只需要一个全局的 uncaughtException 处理程序 nodejs.org/api/process.html#process_event_uncaughtexception
  • 我真的不知道“throw”是什么,但是如果我的应用程序在 API 上得到一些负载,它会崩溃并破坏整个 mongodb,它必须重新开始
  • 这是控制台上的样子:[21:20:34:53] Message: "Checking min deposite - 1674091486"undefined:1^
  • 我会让它崩溃并在pm2forever 等工具的帮助下重新启动,以重新启动应用程序。或者您可以使用 try/catch 或限制请求“处理”它...
【解决方案2】:

我想稍微扩展一下@André Werlang 的回答。我的问题是我不得不进行数百次调用(由于 API 限制),并且还利用 Promise.all() 在所有 Promise 完成后返回所有数据。这可能不是理想的,甚至是 Promise.all() 的正确用法 - 但就错误处理而言,它的工作方式符合我的预期:

const requestPromise = (req) => {
    return new Promise((resolve, reject) => {
        const maxRetries = 5;
        function tryRequest(retries) {
                // try a request (http)
                if (someErr) {
                    setTimeOut(()=>{ tryRequest(maxRetries--); }, 2000);
                    return;
                }
                else {
                    // resolve your Promise
                    resolve(data);
                }
        }
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 2013-11-14
    • 1970-01-01
    • 2014-09-04
    • 2013-09-06
    • 2013-12-06
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多