首页 > 解决方案 > 打破请求-承诺的循环

问题描述

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

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

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
  })
}

标签: javascriptnode.jsasynchronousasync-awaitrequest-promise

解决方案


只有当循环位于当前函数时,您才能从循环中中断。如果循环在函数之外(例如,.then回调),您就无法摆脱它。

而不是使用.then,将awaited 字符串分配给一个变量并检查它(并确保检查字符串,而'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数组。


推荐阅读