Javascript 如何多次重试承诺函数?

Javascript 如何多次重试承诺函数?,javascript,promise,Javascript,Promise,在我的应用程序中,我有一个承诺的函数“serverGet()”,它进行服务器调用。有时,服务器返回一个HTTP 200响应,但其中包含一个空对象。如果我尝试2到3次,就会得到完整的JSON。 现在是找到最终解决方案的时候了,我想创建一个JS脚本,允许多次重新执行这个承诺的函数,直到得到结果为止 这是我开发的,但不幸的是,在重试4-3-2-1时没有返回任何内容: function promiseWithRetry(fn, retries){ console.log("retry :"+r

在我的应用程序中,我有一个承诺的函数“serverGet()”,它进行服务器调用。有时,服务器返回一个HTTP 200响应,但其中包含一个空对象。如果我尝试2到3次,就会得到完整的JSON。 现在是找到最终解决方案的时候了,我想创建一个JS脚本,允许多次重新执行这个承诺的函数,直到得到结果为止

这是我开发的,但不幸的是,在重试4-3-2-1时没有返回任何内容:

function promiseWithRetry(fn, retries){

    console.log("retry :"+retries);

    return new Promise(function(resolve, reject) {
        fn.then(function(response){

            if(_.isEmpty(response) && retries > 0){
                console.log("start new retry");
                Promise.resolve(promiseWithRetry(fn, retries-1));

            }else{
                console.log("resolve");
                resolve(response);
            }

        });
    });
}

promiseWithRetry(serverGet(parameters), 5).then(function(response){
  console.log(response)
});
为了模拟serverGet(),我在JSFIDLE中编写了一个小的随机函数,因此执行代码几次以测试它:

你能帮我吗


Christophe

如果
fn
应该是一个函数(而且它必须是!),那么您需要像调用
fn()
那样调用它,并且实际传递一个函数而不是一个承诺。另外,要避免!(顺便说一句,
Promise.resolve(…)
而不是
resolve(…)
从未奏效)我建议您搜索“迭代承诺”(甚至是“递归的”)keywords@Bergi我不太明白。你能给我举个例子吗?我不能做
fn()。然后(函数(响应){…
,或者你可以用一些语法糖:。将
PromiseWithRetry
函数传递给一个生成器,它使用你希望用参数调用的函数。如果
fn
应该是一个函数(而且它必须是!),你需要像
fn()那样调用它
,并且实际上传递的是一个函数而不是一个承诺。另外,要避免!(顺便说一句,
承诺.解决(…)
而不是
解决(…)
从未工作过)我建议您搜索“迭代承诺”(甚至“递归”)keywords@Bergi我不太明白。你能给我举个例子吗?我不会
fn()。那么(函数(response){…
或者您可以使用一些语法糖:。将
PromiseWithRetry
函数传递给一个生成器,该生成器使用您希望使用参数调用的函数。