这可能是我不知道的关于JS和/或Mithril的一些新手事物,但是我已经围绕Mithril的m.request()编写了一个缓存包装器,以跟踪多个挂起的请求,目的是合并多个相同的请求(该概念非常适合后端RESTful API)。

我的包装函数是这样的:

function sendRequest(sdrcfg,rqscfg) {
    var key=JSON.stringify(rqscfg);
    var ret=sdrcfg.cache[key];

    if(!ret) {
        var cleanup=function(dta) {
            delete sdrcfg.cache[key];
            sdrcfg.removed(key);
            if(Object.keys(sdrcfg.cache).length==0) { sdrcfg.completed(key); }
            return dta;
            };

        ret=m.request(rqscfg).then(cleanup,cleanup);

        if(Object.keys(sdrcfg.cache).length==0) { sdrcfg.activated(key); }
        sdrcfg.cache[key]=ret;
        sdrcfg.added(key);
        }
    return ret;
    }

我遇到的问题是,当存在.then(cleanup,cleanup)子句时,链接到请求的所有后续then()子句的成功函数都会收到来自主机的任何错误,其最终效果是将失败响应转换为下游的成功响应码。

如果我简单地注释掉上面的then子句,则应用程序代码具有按预期方式调用的成功或失败函数。

想要做的事情似乎很直截了当,完全符合Leo的榜样,但是我很沮丧。 JS尤其是Promise对我来说是新的,因此我不知道确切地如何使用它们,或者不知道这是预期的-我只是在遵循示例并尝试在其上构建。

我在哪里错呢?

最佳答案

您可能应该这样做:

.then(cleanup, function(e) {
  cleanup()
  throw e; //re-reject for downstreams
})

promise 拒绝类似于catch块,因此一旦添加了回调以对其进行处理,它将触发该链其余部分的resolve回调。

从Mithril 0.1.22开始,如果未处理,则程序员错误(如ReferenceError)将记录到控制台。这将恢复为0.1.19的行为。

08-25 01:28