in lib/generator.js [1254:1286]
visitRuntimeBefore(ast, level, env) {
assert.equal(ast.type, 'object');
const retryType = this.getRealModelName('Darabonba.RetryPolicy', 'RetryOptions');
this.emit(`Dictionary<string, object> ${RUNTIME} = `, level);
// this.visitConstructObject(ast, level, env);
// TODO 这里有个问题:当runtime不是全量的,例如只有一个retry: true时,左边类型为Dictionary<string, object>,右边类型为Dictionary<string, bool?>,会报错
// 现在openapi中是全量的,所以暂时没有问题
this.visitObject(ast, level, env);
this.emit(';\n');
this.emit('\n');
this.emit('RetryPolicyContext _retryPolicyContext = null;\n', level);
this.emit('Darabonba.Request _lastRequest = null;\n', level);
this.emit('Darabonba.Response _lastResponse = null;\n', level);
this.emit('Exception _lastException = null;\n', level);
this.emit('long _now = System.DateTime.Now.Millisecond;\n', level);
this.emit('int _retriesAttempted = 0;\n', level);
this.emit('_retryPolicyContext = new RetryPolicyContext\n', level);
this.emit('{\n', level);
this.emit('RetriesAttempted = _retriesAttempted\n', level + 1);
this.emit('};\n', level);
this.emit(`while (Core.ShouldRetry((${retryType})${RUNTIME}["retryOptions"], _retryPolicyContext))\n`, level);
this.emit('{\n', level);
this.emit('if (_retriesAttempted > 0)\n', level + 1);
this.emit('{\n', level + 1);
this.emit(`int backoffTime = Core.GetBackoffDelay((${retryType})${RUNTIME}["retryOptions"], _retryPolicyContext);\n`, level + 2);
this.emit('if (backoffTime > 0)\n', level + 2);
this.emit('{\n', level + 2);
this.emit('Core.Sleep(backoffTime);\n', level + 3);
this.emit('}\n', level + 2);
this.emit('}\n', level + 1);
this.emit('try\n', level + 1);
this.emit('{\n', level + 1);
}