ES6循环与异步调用

时间:2018-09-10 15:07:31

标签: javascript ecmascript-6 es6-promise

我需要写一些Javascript(ES6版本)来执行以下任务:

  1. 字符串为“ item1,item2,item3,item4,item5”,
  2. 使用此字符串获取()URL。
  3. 如果响应标志成功,则完成并退出。
  4. 如果响应标志失败,则删除最后一项(item5),现在字符串为“ item1,item2,item3,item4”,然后重复步骤2。
  5. 如果没有其他物品要放下,请退出。

项目总数是可变的。因此,我计划使用以下结构使用do循环执行此任务:

//suppose str = 'item1,item2,item3,....itemN'
do {
    fetch(url, {param1: str}).then(response => {
        //check the response flag, if success, done and exit.
        //if not success, drop one item and re-do fetch
    })
}

问题在于,提取是异步调用,因此我无法强制按顺序执行每个提取。

我需要确保仅在先前的fetch()失败时才执行新的fetch()。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可以使用递归:

function fetchRecursive(param) {

  return fetch(url, {param1: param})
    .then(response => response.ok ? response : Promise.reject(new Error(response.status)))
    .catch((err) => {
      if (param.length > 1) {
        return fetchRecursive(param.slice(0,-1));
      } else {
        return Promise.reject(err);
      }
    })
}

fetchRecursive([ 'item1', 'item2', 'item3', 'item4' ])
  .then(response => { ... })
  .catch(err => { ... });

答案 1 :(得分:0)

也许您可以使用递归,如下所示:

//str = 'item1,item2,item3,....itemN'
function fetchUrl(str){
  fetch(url, {param1: str}).then(response => {
        if(response.success){
          //exit from the program
          return response;
        }
        else
        {
          return fetchUrl(str.split(",").pop().join(","));
        }
    });
}

答案 2 :(得分:-2)

在for循环中使用await代替then