这可能是我不知道的关于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的行为。