Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mithrilajax包装器m.request将失败转换为成功_Javascript_Ajax_Mithril.js - Fatal编程技术网

Javascript mithrilajax包装器m.request将失败转换为成功

Javascript mithrilajax包装器m.request将失败转换为成功,javascript,ajax,mithril.js,Javascript,Ajax,Mithril.js,这可能是关于JS和/或Mithril的一些新手的事情,我不知道,但是我已经围绕Mithril的m.request()编写了一个缓存包装器来跟踪多个挂起的请求,目的是合并多个相同的请求(这一概念非常适合后端RESTful API) 我的包装函数如下所示: function sendRequest(sdrcfg,rqscfg) { var key=JSON.stringify(rqscfg); var ret=sdrcfg.cache[key]; if(!ret) {

这可能是关于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()
子句的success函数都会接收到来自主机的任何错误,其净效果是将失败响应转换为下游代码的成功响应

如果我只是注释掉上面的then子句,那么应用程序代码将按预期调用success或failure函数

这似乎是一件非常直截了当的事情,完全符合利奥的例子,但我被难倒了。JS,尤其是承诺对我来说是新的,所以我不知道如何使用它们,或者这是否是预期的——我只是在遵循示例并尝试在它们的基础上进行构建


我在这方面哪里出了问题?

您可能应该:

.then(cleanup, function(e) {
  cleanup()
  throw e; //re-reject for downstreams
})
承诺拒绝类似于catch块,因此一旦添加回调来处理它,它就会触发链其余部分的resolve回调



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

这是有道理的。我是在你的例子中遗漏了这一点,还是在文章中的例子也有同样的错误?