【问题标题】:Promise inside a Promise承诺中的承诺
【发布时间】:2018-06-23 23:07:38
【问题描述】:

我正在尝试创建一个实用服务,以帮助我团队中的其他开发人员执行特定查询,而无需打开和关闭连接。

这是我写的:

module.exports.connect = function(runner){
  var connection; 
  return MongoClient.connect(url)
  .then( conn => {
    connection = conn;
    var db = connection.db('looladb');
    return db;
  })
  .then (db => runner(db))
  .then (() => connection.close())
  .catch(err => console.log('Error with mongo query', err));
}

这是使用模式:

mongoClient.connect(db => {
		db
			.collection("users")
			.find({email: "shani@gmail.com"})
			.toArray()
			.then(out => console.log('db result', out))
	})

这很好,但我希望使用模式是这样的 -

mongoClient.connect()
  .then(db => {
    db
      .collection("users")
      .find({email: "shani@gmail.com"})
      .toArray()
      .then(out => console.log('db result', out))
  })

【问题讨论】:

  • 在你的“使用模式”和“期望的使用模式”中,你都有var result = db. ....,但是结果从来没有用于任何事情,它有什么意义
  • 我将删除“结果”,但请记住,这就是我需要它作为承诺的原因,我想从调用者那里访问结果(例如,运行在后台使用的 getUsers实用程序)但是 get 的调用者可以定义应该对结果做什么
  • 并不是说你必须删除任何东西,只是你提交代码的方式没有意义——这并不是说var result 可以在.then之外访问
  • 如果你想要一个既能连接又能关闭的实用方法,那么你想做的任何数据库工作都必须夹在.connect().close()之间。所以你必须传递要执行的工作 - 即runner。我认为没有任何逃避您希望避免的使用模式。

标签: javascript node.js mongodb promise


【解决方案1】:

听起来很适合使用finally

module.exports.connect = async () => {
  const connection = await MongoClient.connect(url);
  return new Promise(res => res(connection.db('looladb')))
    .catch(err => console.log('Error with mongo query', err))
    .finally(connection.close)
}

注意 - 正如所指出的,finally 在 Node 上尚未得到官方支持,但可以通过 --harmony-promise-finally 标志启用。或者,您可以使用其他软件包进行支持,例如promise.prototype.finallyBluebird

【讨论】:

  • 还有return new Promise(() => connection.db(‘looladb’))保证一个永久未决的承诺
  • @JaromandaX 哎呀,自动驾驶在悬而未决的承诺上(写在小屏幕上,所以没有验证任何东西)。由于缺乏支持,我用一些选项更新了答案。
  • 所以我还是迷路了,@JaromandaX - 你建议怎么做?因为我需要得到结果(运行 get() 时)
  • @rabashani 根据我的更新,您可以简单地使用 polyfill 或启用标志,直到 Node 发布完全支持。
  • @rabashani - 不知道你为什么问我,这不是我的答案,我只是指出了原始答案中的几个缺陷
猜你喜欢
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多