将带有回调的方法转换为返回带有清理的承诺的方法
Convert a method with a callback to one that returns a promise with cleanup
我试图编写一个函数,执行异步任务并返回一个承诺,同时确保在任何回调完成后发生清理。然而,要做到这一点,我似乎需要提前知道回调,这样我就可以确保它在清理发生之前发生。
目前,函数的一般结构是这样的:
function doSomethingWithResourceAsync(someParameter, usePreparedResourceCb) {
var resource = acquireResource(someParameter);
return prepareResourceAsync(resource)
.then(usePreparedResourceCb)
.finally(doCleanup);
function doCleanup() {
releaseResource(resource);
}
}
要调用它,我将这样做:
doSomethingWithResourceAsync(myParameter, myCallback)
.then(andSoOn);
function myCallback(proxyObj) {
return doMagicAsync(proxyObj);
}
这是我唯一能让它工作的方法。
然而,我想用这样一种方式来写,即我可以链接回调,而不必传递清理回调。所以我想这样命名它:
function doSomethingWithResourceHopefullyAsync(myParameter) {
var resource = acquireResource(someParameter);
return prepareResourceAsync(resource)
.finally(doCleanup); // uh oh
function doCleanup() {
releaseResource(resource);
}
}
doSomethingWithResourceHopefullyAsync(myParameter)
.then(myCallback) // too bad, already cleaned up
.then(andSoOn);
但这不起作用,因为清理发生在myCallback
获得控制并把事情搞砸之前。
如果可能的话,我如何构建我的方法来实现我的目标?还是说我现在所能做的就是最好的?
我有一种感觉,我可以使用延迟来完成我的目标,但我不知道如何设置它来实现这个目标。
我试图开发的API是供那些不一定了解异步方法复杂性的用户使用的,所以我想尽可能地隐藏它。
您所拥有的是处理器模式。这是你自己想出来的小道具:)
"传入"回调是必要的,因为它创建了作用域,这有效地启用了清理。你可以通过回调返回一个承诺来知道它是如何"完成"的。你需要一个作用域的事实是基本的,因为它是我们…范围清理。通过作用域(RAII)将资源分配绑定到实例化是一种非常有用的技术。
我会这样做:
function withResource(handler){
return acquireResource(). // important to return to chain, like your code
then(handler).finally(cleanup);
}
这实际上是你已经拥有的。
正如评论所建议的,bluebird的using
是一个非常有用的抽象,它返回的处理器为您提供了大量清理和清除大量类型错误的能力。我强烈推荐它(尽管我显然有偏见)。
相关文章:
- 打破承诺链的好方法是什么
- 将同步函数包装到承诺中的最佳方法是什么?
- “未捕获(在承诺中)”在获取“then”方法中调用拒绝函数时
- 如何实现这种方法与承诺
- 有没有一个好的方法来缩短Javascript的承诺
- 这是使用承诺与 Sequelize.js的正确方法吗?
- jasmine 2.0测试angularjs的工厂方法,这是一个承诺
- 是否可以覆盖本机 Es6 承诺解析方法
- 在nodejs中使用Q.js承诺进行循环的正确方法
- 将承诺处理程序绑定到其类的更好方法
- 使用取消方法增强ES6承诺
- 承诺取消方法.为什么它还没有实现,而不是其他承诺框架
- 猫鼬静态方法返回蓝鸟承诺
- 如何承诺一个节点.js插件方法
- 问.js节点承诺.“套接字”上缺少错误处理程序.类型错误:无法调用未定义的方法“then”
- 有没有一种 AngularJS 方法来使用带有承诺返回的浏览器模式
- 如何在返回承诺的服务中创建 reset() 方法
- 使用承诺作为数据依赖项的正确方法
- 使用承诺编写可读代码的最佳方法是什么?
- 为什么在Lightswitch中堆叠承诺的一种方法有效,而另一种方法则不起作用