这可能是一些关于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,特别是承诺对我来说是新的,所以我不确切知道如何使用它们,或者如果这是预期的 - 我只是按照示例并尝试构建它们。
我在哪里错了?
答案 0 :(得分:3)
你可能应该这样做:
.then(cleanup, function(e) {
cleanup()
throw e; //re-reject for downstreams
})
承诺拒绝与catch块类似,因此一旦添加回调来处理它,它就会触发链的其余部分的解析回调。
从Mithril 0.1.22开始,如果不处理,程序员错误(如ReferenceError)将记录到控制台。这将恢复为0.1.19的行为。