javascript - 获取 API 直到没有数据

javascript - Fetch API until there is no data

我正在使用 restful API,我需要 post 一些数据。 但在此之前,我需要确保 table 为空。我遇到的问题是这个APIreturn的delete方法成功了,但是并没有立即删除数据,这个数据被发送到队列中尽快删除。

所以在我调用post方法之前,我需要检查这个table上是否有任何物品。怎么多次调用这个方法才能保证post方法只在table为空的时候执行?

async function run() {

    apiDelete()
    .then(() => console.log('deleting')) 
    .then(() => {

        getItems().
        then(() => {
            
            apiPost()
             .then(() => console.log('posting...'))
             .catch(e => console.log(e))
        })
       
      })
      .catch(e => console.log(e))     
     
  return

}

方法:

async function apiPost() {
  const url = 'https://apipost.com/data/v2/1234'
  const options = {
    method: 'POST'
  }  
  return (await fetch(url, options)).json()
}

async function apiDelete() {
  const url = 'https://apidelete.com/data/v2/all'
  const options = {
    method: 'DELETE',    
  }
  return (await fetch(url, options)).json()
}

async function getItems() {
  const url = 'https://apiget.com/data/v2/all'
  const options = {
    method: 'GET',    
  }  
  return (await fetch(url, options)).json()
}

你需要做一个递归调用,退出条件是当元素个数为0时退出。

一种方法可能是这样的:

async function deleteUntilEmpty() {
  await apiDelete();
  const items = await getItems();

  if (items.length) {
    return deleteUntilEmpty();
  }
}

async function run() {
  await deleteUntilEmpty();
  apiPost()
    .then(() => console.log("posting..."))
    .catch((e) => console.log(e));
}

与其不断删除,还不如轮询一下服务器是否完成了原来的删除:

async function pollUntilEmpty() {
  const items = await getItems();

  if (items.length) {
    // this could be a good spot to introduce some kind of 
    // sleep to not DDOS your server ;)
    return pollUntilEmpty();
  }
}

async function deleteAndPollUntilEmpty() {
  await apiDelete();
  await pollUntilEmpty();
}

async function run() {
  await deleteAndPollUntilEmpty();
  apiPost()
    .then(() => console.log("posting..."))
    .catch((e) => console.log(e));
}