【问题标题】:Process an array result of a promise with a promise使用 Promise 处理 Promise 的数组结果
【发布时间】:2015-12-19 09:53:31
【问题描述】:

我有以下以同步方式工作的代码:

function getFoldersOf(dir) {
    return fs.readdirSync(dir).map(p => path.join(dir, p)).filter(p => fs.lstatSync(p).isDirectory());
}

现在考虑使用这些 API(提供的函数在 node 中不存在。这些是假设性的,我必须编写它们):

  • fs.readdirSync -> fs.readdirAsync
  • path.join -> path.joinAsync
  • fs.lstatSync -> fs.lstatAsync

我的问题是将这个函数转换为异步的正确方法是什么?

PS:我怀疑我可以通过响应式扩展轻松解决这个问题!

【问题讨论】:

  • 我知道。这是假设的。我想用我自己写的东西替换node api。
  • 我正在重写节点 api 以在客户端使用它们。所以我需要将它们转换为异步版本。
  • @alisabzevari 您打算如何支持文件系统操作客户端?
  • 如果我需要让它们异步,我会的。
  • @alisabzevari 请在你的问题中详细说明你到底想要做什么。

标签: javascript promise rxjs


【解决方案1】:

一种选择是实现您的文件系统 API,这样每个操作都会返回一个 bluebird 承诺,它已经提供了像 .map().filter() 这样的帮助器。

例如,要将 Node fs API 转换为使用 bluebird 承诺的 API,您可以使用 .promisifyAll()

// node-fs.js
var Promise    = require('bluebird');
module.exports = Promise.promisifyAll(require('fs'));

要使用它(在 Node 中运行您的应用程序时):

// app.js
var path = require('path');
var fs   = require('./node-fs');

function getFoldersOf(dir) {
  return fs.readdirAsync(dir)
           .map(   p => path.join(dir, p))
           .filter(p => fs.lstatAsync(p).then(d => d.isDirectory()));
}

【讨论】:

  • 如果 path.join 也是异步的怎么办。你们其他人的解决方案效果很好。
  • @alisabzevari 如果path.join() 是异步的,则代码不必更改,前提是它还返回了一个承诺。
  • 我再问一次,为什么 path.join 需要异步 - 异步服务于特定目的,只是一时兴起的异步功能毫无意义
  • @JaromandaX 这不是没有意义的。加入路径是特定于平台的操作,我不想让我的客户端依赖于平台。
  • 天哪。这与同步有什么关系?
猜你喜欢
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多