我正在尝试编写一个函数,该函数执行异步任务并返回承诺,同时确保在任何回调完成后发生清理。但是为了做到这一点,我似乎需要提前知道回调,以便在发生清理之前确保它发生。将回调方法转换为使用清理返回承诺的方法
目前,该功能的总体结构是这样的:
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将被不需要知道异步方法的复杂性的用户使用,因此我想尽可能隐藏这些API。
用Bluebird代替Q,你可以使用'using':https://github.com/petkaantonov/bluebird/blob/master/API.md#resource-management –
这可能对未来非常有用,谢谢为我指出这一点。 –
很好搞清楚这个模式在你自己:) –