【发布时间】:2015-12-02 14:53:56
【问题描述】:
我正在尝试编写一个函数来执行异步任务并返回一个承诺,同时确保在任何回调完成后进行清理。但是要做到这一点,我似乎需要提前知道回调,这样我才能确保它在清理发生之前发生。
目前,该函数的一般结构如下所示:
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 是供那些不一定了解异步方法复杂性的用户使用的,所以我想尽可能地隐藏它。
【问题讨论】:
-
用 Bluebird 代替 Q,你可以使用
using: github.com/petkaantonov/bluebird/blob/master/… -
这在未来可能会非常有用,感谢您指出这一点。
-
很高兴自己弄清楚这个模式:)
-
您能否将您的示例扩展为需要清理的内容,以及它需要如何等待
callback创建的承诺(或者:如果您清理了callback中的哪些内容将不起作用过早上升)?有一种模式可以解决这个问题,但我需要详细说明您的问题。 -
@Bergi:这是 Node 应用程序的一部分。在某些情况下,它只是用于记录。其他实例,它用于启动子进程(和日志记录)。在我的用例中,必须运行子进程才能使回调起作用。有机会我会更新的。
标签: javascript callback promise q