【问题标题】:Sort asynchronously with external source与外部源异步排序
【发布时间】:2021-07-28 02:17:34
【问题描述】:

我想在 Typescript 中按克隆对我的 Github 存储库进行排序
纯js中的等价物是

repos.sort(async (a, b) => {
  (await insights.traffic.clones(user, b.name, username, password)).uniques -
    (await insights.traffic.clones(user, a.name, username, password)).uniques;
});

但是Array.prototype.sort() 不适用于 async/await

reposhttps://api.github.com/users/<user>/repos
insightsimport * as insights from 'github-insights' Docs for clones

这会将存储库按降序排序为唯一克隆

它将获取我帐户的每个 repo,然后使用 https://api.github.com/repos/<user>/<repo>/traffic/clones 对其进行排序

有没有办法让它工作?

使用fast-sort
我想出了这个

const sorted = sort(repos).desc([
  async (u) => await (await insights.traffic.clones(user, u.name, username, password)).uniques
]);

但这根本没有排序,它只是repos

【问题讨论】:

  • 尝试首先获取所有信息,将其放入数组中并然后排序。
  • 埃弗特所说的。每个元素都会多次调用排序委托,因此无论如何您都不需要async 排序委托。
  • @Evert 但是我必须手动管理所有存储库和相应克隆之间的连接,并且必须为每个存储库获取它。有什么高效便捷的方法吗?
  • @kaaaxcreators 如果“手动管理连接”是指使用数组创建一个简单的数据结构,那么是的.. 这样做。这是简单的方法。我将把它作为伪代码作为答案

标签: typescript sorting asynchronous async-await github-api


【解决方案1】:

尝试先获取所有信息,将其放入数组中,然后排序。

伪代码:

async function getClonesForRepo(repo) {
 // Do your thing and return a number
}

const repoClones = new Map();
for(const repo of repos) {
  repoClones.set(repo.name, await getClonesForRepo(repo));
}

const sorted = repos.sort(
  (a, b) => repoClones.get(a.name) - repoClones.get(b.name)
);

【讨论】:

  • 地图和排序后的数组的长度为 0
  • 如果地图为空,则repos为空。
  • 我的错误,我做错了一些事情。然后我检查了回购长度,你是对的。我过滤错了。非常感谢
猜你喜欢
  • 2017-07-06
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多