2

我需要在进行 AJAX 调用之前和在 AJAX 调用之后(在调用实际处理程序方法之前)成功调用一些常用方法。我正在使用dojo.aspect来实现这一点。

这是我的代码示例

function makeAjaxCall(){
    dojo.xhrGet({
        url:"sample_url",
        content:{
            test:"value"
        },
        load:function(response){
            //Do some logic here
        },
        error:function(response){
            //handle error
        }
    });

}

下面是dojo.aspect我用来挂断XHR电话的那个。

define(["dojo/aspect"], function(aspect){
     aspect.after(dojo, "xhr", function(deferred){
        console.log("AJAX AFTER");
        deferred.then(function(response){
            //CALLED AFTER 'load' METHOD IS CALLED.
            console.log("Testing");
        });
     });
    aspect.before(dojo, "xhr", function(method, args){

        console.log("AJAX BEFORE");
    });
});

现在问题是deferred.thenaspect.after调用“ load”函数之后调用内部。是否可以在调用实际加载方法之前调用一个方法?

4

3 回答 3

2

简短的回答是肯定的。

首先,有两种方法可以在 Dojo 中进行 ajax 调用。

  1. dojo/xhr- 这就是你上面的内容,不推荐使用
  2. dojo/request/xhr

第一个实现将调用第二个实现。所以我建议使用 aop on dojo/request/xhr

aspect.around(require.modules['dojo/request/xhr'], 'result', function(originalXhr){
    return function(url, options, returnDeferred){

        var dfd = new Deferred();

        // Logic before making the xhr call

        originalXhr(url, options, returnDeferred)
            .then(function(response) {

                // Logic handling the response but before resolving the deferred.
                dfd.resolve(vm);
                // Logic after resolving the deferred.

            }, function(err){
                // error handling?
                dfd.reject(msgs);

            }, function(update) {
                dfd.progress(update);
        });

        return dfd;
    };
}); 

您可以在 https://github.com/cswing/evinceframework/blob/master/evf-web-js/src/dojo/evf/serviceRegistry.js找到完整的实现(~ 第 111 行)

用法:

require('dojo/xhr/request', function(xhr){
    xhr({...}).then(
        function(response) {
            //handle response
        },
        function(error) {
            //handle error
        }
    );
});

dojo/xhr代码将自行转换为上述用法,因此您发布的代码应该可以工作。

于 2013-06-17T11:06:11.570 回答
0

如果你切换到新的 API - dojo/request

然后你可以使用dojo/request/xhrdojo/request/notify

于 2013-08-03T02:01:53.497 回答
0

在 Dojo 1.10 中,有一个新的 API 可以全局捕获请求的状态。

notify("error", function(error){
    console.error(error);
    //SyntaxError: Unexpected token < in JSON at position 0(…)
});

但就我而言,我在 html 中遇到错误,例如。所以在错误中我得到“错误 SyntaxError: Unexpected token < in JSON at position 0(...)”

在以前的版本中,可以访问响应对象:

topic.subscribe("/dojo/io/error", function(/*dojo.Deferred*/ dfd, /*Object*/ response){   
  if (response.status === 401) {
    window.location.reload();
  }

});

所以我发现可以自定义 json 处理程序:

require(["dojo/request/handlers"], function(handlers){

handlers.register("json", function(response){

    if (response.status === 401) {
        window.location.reload();
        return;
    }

    return JSON.parse(response.text || null);
});

});

这样您就可以在 JSON.parse 抛出异常之前检测到 response.errors。

于 2016-10-28T09:51:39.670 回答