我已经在多个地方阅读了诺言处理程序模式,但我不知道它是什么。建议我在如下代码中使用它:
function getDb(){
return myDbDriver.getConnection();
}
var users = getDb().then(function(conn){
return conn.query("SELECT name FROM users").finally(function(users){
conn.release();
});
});
什么是Proposal Disposer模式,在这里如何应用?
注意-在本机的Promise中,我.finally
做为“添加返回值但执行操作的拒绝和实现处理程序”。在这种情况下,我会使用蓝鸟。
上述方法的问题在于,如果您在每次执行操作后都忘记释放连接getDb
,则可能会导致资源泄漏,当应用程序耗尽资源时,该应用程序最终可能会冻结。
您可以在一处做:
var users = getDb().then(function(conn){
return conn.query("SELECT name FROM users");
});
这将泄漏从未关闭过的数据库连接。
分配器模式是一种将代码范围与拥有资源耦合的方式。通过将资源绑定到作用域,我们确保在完成处理后始终将其释放,并且我们不能轻易忘记释放它。它类似于using
C#with
中的Python和Java中的try-
with-resource以及C ++中的RAII。
看起来像:
withResource(function(resource){
return fnThatDoesWorkWithResource(resource); // returns a promise
}).then(function(result){
// resource disposed here
});
如果我们将代码编写为:
function withDb(work){
var _db;
return myDbDriver.getConnection().then(function(db){
_db = db; // keep reference
return work(db); // perform work on db
}).finally(function(){
if (_db)
_db.release();
});
}
我们可以将上面的代码编写为:
withDb(function(conn){
return conn.query("SELECT name FROM users");
}).then(function(users){
// connection released here
});
处置程序模式的用户示例包括sequelize和knex(书架的查询生成器)。例如,还可以将其用于更简单的操作,例如在完成所有AJAX请求后隐藏加载程序。
由于您正在使用bluebird,因此它具有专用功能Promise.using
和.disposer
内置功能,可让您立即处理可能需要考虑的多个资源。
问题内容: 我正在尝试用正确的方法表示正确的方法,以指示内发生故障。 如果诺言没有失败,(即返回诺言的操作是否正常工作,例如返回状态200的AJAX请求),但是我认为结果无效,通常我会这样做弹出窗口,向用户说明问题,然后执行“返回假”;尽早退出该方法。 但是,有了承诺,如果我想从.then()内部做类似的事情,我就被引导去相信我应该做的是抛出一个错误,而应该让它被.catch()抓住。 ),我已经
问题内容: 作为节点程序员。我习惯于使用“ nodebacks”来处理代码中的错误: 编写该函数时,我可以执行以下操作: 我如何用promises处理这种错误? 问题答案: 经验法则 每当您对如何使用Promise有所疑问时,请考虑一下同步版本。 至少对我来说,这比第一个参数有时是的回调要干净得多。 promises方式几乎总是与问题的同步版本非常相似: 使用回调函数时,myFn看起来像什么: 使
问题内容: 我使用ES6 Promises来管理我的所有网络数据检索,并且在某些情况下需要强制取消它们。 基本上,这种情况是这样的:我在UI上进行了预先输入搜索,在该UI中,将请求委派给后端必须基于部分输入执行搜索。尽管此网络请求(#1)可能需要一点时间,但用户继续输入,最终会触发另一个后端调用(#2) 这里#2自然优先于#1,因此我想取消Promise包装请求#1。我已经在数据层中缓存了所有Pr
问题内容: 我对诺言仍然还很陌生,目前正在使用蓝鸟,但是在我不确定如何最好地处理它的情况下。 因此,举例来说,我在Express应用程序中有一个Promise链,如下所示: 所以我的行为是: 通过ID获取帐户 如果此时存在拒绝,请炸开并返回错误 如果没有错误,则将文档转换为模型 使用数据库文档验证密码 如果密码不匹配,则炸开并返回其他错误 如果没有错误,请更改密码 然后返回成功 如果有其他问题,请
问题内容: 我对诺言仍然相当陌生,并且目前正在使用蓝鸟,但是在我不确定如何最好地处理它的情况下。 因此,例如,我在快速应用程序中有一个promise链,如下所示: 所以我的行为是: 通过ID获取帐户 如果此时存在拒绝,请炸毁并返回错误 如果没有错误,则将文档转换为模型 使用数据库文档验证密码 如果密码不匹配,则炸开并返回其他错误 如果没有错误,请更改密码 然后返回成功 如果还有其他问题,请返回50
问题内容: 我正在开发Angular 6应用程序,并且被告知以下内容是反模式: 我意识到等待承诺链毫无意义。如果someFunction()返回Promise,则在等待时不需要Promise链。你可以这样做: 但是有人告诉我,等待一个诺言链可能会导致错误,或者会破坏我的代码。如果上面的第一个代码段与第二个代码段执行相同的操作,那么使用哪个代码段有什么关系呢。第一段不会引入第二段带来的危险? 问题答