微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-将带有回调的方法转换为以清除方式返回诺言的方法

我正在尝试编写一个函数,该函数执行异步任务并返回promise,同时确保在完成任何回调后进行清理.但是要这样做,似乎我需要提前知道回调,这样我才能确保它在清理发生之前发生.

当前,该函数的一般结构如下所示:

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将由不一定了解异步方法复杂性的用户使用,因此我想尽可能地隐藏它.

解决方法:

您拥有的是disposer pattern.自行解决它的道具:)

“传递”回调是必要的,因为它创建了一个有效启用清除的作用域.您将知道通过返回承诺如何“完成”回调.您需要一个作用域的事实是基础,因为这正是…作用域的清理范围.通过作用域(RAII)将资源分配绑定到实例化是一种有用的技术.

我会做类似的事情:

function withResource(handler){
    return acquireResource(). // important to return to chain, like your code
           then(handler).finally(cleanup);
}

实际上,这就是您已经拥有的.

正如评论所建议的那样,bluebird的使用是非常有用的抽象,它返回处理程序,为您提供了清理和清除许多类型错误的强大功能.我强烈推荐它(尽管我显然有偏见).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐