4

这很可能是我不知道的关于 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,特别是 promises 对我来说是新的,所以我不知道如何使用它们,或者如果这是预期的——我只是在遵循示例并尝试在它们的基础上进行构建。

我哪里错了?

4

1 回答 1

3

你可能应该这样做:

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

Promise 拒绝类似于一个 catch 块,所以一旦添加一个回调来处理它,它就会触发链其余部分的 resolve 回调。


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

于 2014-09-23T22:16:56.903 回答