打破请求-承诺循环

break a loop of request-promise

每次请求不同的页面时,我都会遍历此 url /api?id=1&page=,直到获得我想要的结果。

我不知道如何以及为什么我无法从请求中停止循环。

async something() {

  let results = []
  for (let i = 0;i < 999;i++) {
    await rp('/api?id=1page='+i).then(string => {
     results.push(string)
     if(results === 'THE END') {
        // break here
     }
    })
  }
  Promise.all(results).then(res => {
   // do something
  })
}

只有当循环 当前函数内时,您才能从循环中中断。如果循环在函数之外(例如,.then 回调),则无法跳出。

不使用 .then,而是将 awaited 字符串分配给一个变量并检查它(并确保检查 string'THE END',不是 results 数组):

async something() {
  const results = [];
  for (let i = 0;i < 999;i++) {;
    const string = await rp('/api?id=1page='+i);
    results.push(string);
    if(string === 'THE END') {
      break;
    }
  }
  // do something with results
}

请注意,由于您正在将 解析值本身 推送到 results 数组,因此无需在数组上调用 Promise.all

考虑到 rp 是请求您 url 的函数,这是我能想到的最简单的答案。

let results = []
  for (let i = 0;i < 999;i++) {//if i is greater than or equal 999, the loop will end
    await rp('/api?id=1page='+i).then(string => {
     results.push(string)
     if(results === 'THE END') {
        //do stuffs you need to do
        // break here
        i = 1000;
     }
    })
  }