Async: 文档需要更好的例子

创建于 2019-01-14  ·  21评论  ·  资料来源: caolan/async

考虑这个地图示例

async.map(['file1','file2','file3'], fs.stat, function(err, results) {
    // results is now an array of stats for each file
});

除了语法,这基本上没有告诉我什么。 在大多数情况下,人们不会通过fs.stat 。 示例应包括所有可能选项的使用。 所有函数和方法的所有示例都需要更新。 他们太简单了

docs help wanted

最有用的评论

我同意,我们需要更好的文档。 我还想更改许多示例(或添加 mroe 示例)以使用 async/await。 但是,这是需要时间的事情,我目前没有。

所有21条评论

我同意,我们需要更好的文档。 我还想更改许多示例(或添加 mroe 示例)以使用 async/await。 但是,这是需要时间的事情,我目前没有。

也许我可以帮忙。

我如何帮助举例?

  • 更多async / await例子,更少的回调
  • 来自实际应用的更具体的例子,更少foo / bar
  • 显示异步“最佳位置”的事情——没有库就很难做到的事情
  • Node/JS 新手可以访问的示例展示了参数如何流过
  • 更全面的例子展示了单个方法的更多特征

大多数方法的 JSDoc 注释中有@example块。 发疯!

注意那个特定的例子,你可以做

await async.map(['file1','file2','file3'], fs.promises.stat);
// or without async lib
await Promise.all(['file1','file2','file3'].map(name => fs.promises.stat(name))

或者如果你想要一个对象作为结果

await async.auto({
  file1: async()=>fs.promises.stat('file1'),
  file2: async()=>fs.promises.stat('file2')
  file3: async()=>fs.promises.stat('file3')
})
// or without async lib
Object.fromEntries(
  await Promise.all(['file1','file2','file3'].map(async name => [name, await fs.promises.stat(name)]))
)

我特别在寻找一个(简单的)基于 Promise 的 async.mapLimit 示例,即使没有 async/await。 到目前为止还没有找到任何非回调示例。

@flatcoding https://github.com/caub/misc/blob/master/utils/promise-concurrent.js ,如果你不想要await ,你可以用递归函数替换它

嗨,西里尔@caub
感谢您的回复。 我并不是特别反对“await”,而是为了“async”模块的“好例子”,我想开始并查看具有基本 Promise 处理的实现,包括 .then .catch。
老实说,我在一般情况下很难将 async 与 Promises 结合使用,所以在使用 async/await 之前,我只想从步骤 1) 开始……
顺便说一句,感谢您分享您的示例,但我不太确定它与异步模块的关系。

我认为“简单的基于 Promise 的示例”是指没有任何库的示例

如果你想要这个图书馆的例子,我相信有很多

是的,所以我一般都可以使用 Promises,而且我了解如何在回调样式中使用“异步”模块。 正如文档所述,如果不提供回调,它将返回一个 Promise。 到目前为止,我不能很好的例子,至少不是 async.map(Limit) 。 由于这个线程是关于文档中的“更好的例子”,我在这里插话...
如前所述,我真的无法使用 Promise 启动并运行它,甚至提出了一个问题。

@caub

@romanbalayan不错

我们最常用的方法是async.parallelasync.auto ,您是否也打算涵盖这些方法?

注意:我认为您可以在 async/await 示例中避免使用 async IIFE (async ()=>{ ,以使事情变得更轻松

@caub ,更新了移除 IIFE 的拉取请求。 (使用它在本地测试样品是否真的有效)

是的,我也想尽快介绍流量控制。 如果我对集合示例所做的更改符合此处的期望,我实际上只是在等待反馈。

@romanbalayan你可以做的是将该 PR 分支设置为 github 页面(进入你的异步分支,设置 > Github 页面 > 源:(选择你的 PR 分支)),以便我们可以在http://romanbalayan.github 中预览它

@caub ,好主意。 这样做了,现在应该可以在https://romanbalayan.github.io/async/v3/ 上使用

@caub

为流控制方法添加了 Promise 和 async/await 示例 - async.parallelasync.seriesasync.auto

@romanbalayan不错! https://romanbalayan.github.io/async/v3/docs.html#auto

我觉得回调和承诺示例总是非常相似,可能值得只使用其中一个,因为无论如何在使用承诺时,我们宁愿选择 async/await,它会减轻一些负担

别的好东西!

@caub

我还应该删除 Collections 方法上的 Promises 用法示例吗?

我想是的,你可以

同样对于流控制方法,您可以添加具有异步内部函数的示例,例如:

const delay = (t, v) => new Promise(r => setTimeout(r, t, v));

try {
    console.time('parallel')
    const results = await async.parallel({
        one: async () => delay(200, 1),
        two: async () => delay(100, 2),
    });
    console.timeLog('parallel', results);
    // parallel: 200ms { one: 1, two: 2 }
}
catch (err) {
    console.log(err);
}

@romanbalayan很棒的工作。 我真希望几天前就找到了您的文档版本! 毕竟,我确实通过反复试验发现了事情是如何运作的,但是使用新示例不会那么痛苦:-)
既然我们有 async/await 和 Promise.all 以及 Promise.allSettled ,我仍然不能 100% 确定某些异步方法的效用 .. 基本上我想知道此时是否有所有方法的本机等效项. (?)

const results = await async.parallel({
    one: async () => delay(200, 1),
    two: async () => delay(100, 2),
});

将被本地编写:

const results = Object.fromEntries(
  await Promise.all(
    Object.entries({
      one: async () => delay(200, 1),
      two: async () => delay(100, 2),
    })
      .map(async ([k, v]) => [k, await v()])
  )
);
此页面是否有帮助?
0 / 5 - 0 等级