【问题标题】:Nodejs : Promise chain terminates after a certain limit without throwing any errorsNodejs:承诺链在一定限制后终止而不会引发任何错误
【发布时间】:2021-08-18 17:51:29
【问题描述】:

我正在尝试使用 Promise 在 nodejs 中做一个简单的操作。我有一个数组,其中包含对象。这些对象又包含我想用 GET 请求命中的 url 的查询参数。我希望 get 请求是连续的,因为请求的数量约为 6000。我在互联网上搜索并偶然发现了这篇介绍如何按顺序运行 Promise 的中型文章。 Medium article link

按照方法,我写了以下sn-p-

let itr = set[Symbol.iterator]();//set which contains the objects to be pushed to the function 
                                //that makes the GET request
let runNext = ()=>{
    fetchLinks(itr.next().value).then( x =>{ //fetchLinks returns a new Promise which wraps the 
                                            //GET request. on successful response, I resolve(1)
        runNext();
    }).catch(err=>{
        console.log("storing");
        translateMapAndStore();//fetchLinks returns a reject when an undefined object is detected.
                  //a global object is storing the response data which is then written to a file.
    });
}
runNext();//initiate the recursive promise chain

我现在面临的错误是该进程在准确获取 11 次后终止。我不知道这背后的原因。没有错误被抛出,进程优雅地退出。这里有什么我错过的吗?

【问题讨论】:

  • 关于运行时环境的附加信息 - MacOS Big Sur 11.5.1 + 节点版本 15.14.0
  • 使用Symbol.iterator进行异步操作感觉不对。您可能需要Symbol.asyncIterator。还有使用迭代器的目的是什么?为什么不使用await 的简单 for 循环?

标签: javascript node.js promise


【解决方案1】:

为什么不像下面那样?

const urls = ["url0", "url1", "url2"];

(async function run() {
  for (const url of urls) {
    try {
      await fetchLinks(url);
    } catch (err) {
      console.log(err);
      console.log("storing");
      translateMapAndStore();
    }
  }
})();

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 2020-07-22
    • 1970-01-01
    • 2020-06-13
    • 2022-12-04
    • 1970-01-01
    • 2018-01-29
    • 2015-09-05
    相关资源
    最近更新 更多