Jquery 在发送之前使用JS解码器和ajax

Jquery 在发送之前使用JS解码器和ajax,jquery,amplifyjs,Jquery,Amplifyjs,好的,正在准备放大解码器。奇怪的问题。如果我有一个beforeSend附加到我的请求,解码器不会启动。删除beforeSend,解码器将启动 下面是两个例子 没有事先发送 在发送之前 有人能告诉我发生了什么事吗?如果我有一个beforeSend,为什么解码器不能工作?我假设解码器应该在收到请求后启动,所以beforeSend应该不会对其产生任何影响 注意:stackoverflow希望我在这里发布代码,而不仅仅是小提琴 beforeSend : function( _xhr, _ajaxS

好的,正在准备放大解码器。奇怪的问题。如果我有一个beforeSend附加到我的请求,解码器不会启动。删除beforeSend,解码器将启动

下面是两个例子

  • 没有事先发送

  • 在发送之前
  • 有人能告诉我发生了什么事吗?如果我有一个beforeSend,为什么解码器不能工作?我假设解码器应该在收到请求后启动,所以beforeSend应该不会对其产生任何影响

    注意:stackoverflow希望我在这里发布代码,而不仅仅是小提琴

    beforeSend : function( _xhr, _ajaxSettings ) {
    
                    xhr = _xhr;
                    ajaxSettings = _ajaxSettings;
                    var ret = defnSettings.beforeSend ?
                        defnSettings.beforeSend.call( this, ampXHR, ajaxSettings ) : true;
                    return ret && amplify.publish( "request.before.ajax",
                        defnSettings, settings, ajaxSettings, ampXHR );
                }
            });
    
    amplify.subscribe( "request.before.ajax", function( resource, settings, ajaxSettings, ampXHR ) {
    var _success = ampXHR.success,
        _error = ampXHR.error,
        decoder = $.isFunction( resource.decoder )
            ? resource.decoder
            : resource.decoder in amplify.request.decoders
                ? amplify.request.decoders[ resource.decoder ]
                : amplify.request.decoders._default;
    
    if ( !decoder ) {
        return;
    }
    
    function success( data, status ) {
        _success( data, status );
    }
    function error( data, status ) {
        _error( data, status );
    }
    ampXHR.success = function( data, status ) {
        decoder( data, status, ampXHR, success, error );
    };
    ampXHR.error = function( data, status ) {
        decoder( data, status, ampXHR, success, error );
    };
    
    amplify.request.define("testRequest", "ajax", {
    
    url: "/echo/json/",
    dataType: 'json',
    type: 'POST',
    decoder: function(data, status, xhr, success, error) {
        console.log('decoder fired');
        $('.messages').append('<div>decoder fired </div>');
        success(data);
    },
    beforeSend: function(xhr){
    //not doing anything here, just logging;
        console.log('before send fired');
        $('.messages').append('<div>before send fired </div>');
        return true; //this is the key
    }
    
    //请检查小提琴

    amplify.request({
        resourceId: "testRequest",
        data: {
            json: JSON.stringify({
                text: 'hello world'
            })
        },
        success: function(data, status) {
            console.log(data, status);
            $('.messages').append('<div> text retrieved: ' + data.text + '</div>');
        },
        error: function(status, xhr) {
            console.log(xhr);
        }
    });​
    
    amplify.request({
    resourceId:“testRequest”,
    数据:{
    json:json.stringify({
    文字:“你好,世界”
    })
    },
    成功:功能(数据、状态){
    控制台日志(数据、状态);
    $('.messages').append('检索到的文本:'+data.text+'');
    },
    错误:函数(状态,xhr){
    console.log(xhr);
    }
    });​
    

    帮忙


    -Suj刚刚从示例页面复制了这一点。希望能有帮助

    amplify.request.decoders.appEnvelope =
        function ( data, status, xhr, success, error ) {
            if ( data.status === "success" ) {
                success( data.data );
            } else if ( data.status === "fail" || data.status === "error" ) {
                error( data.message, data.status );
            } else {
                error( data.message , "fatal" );
            }
        };
    
    amplify.request.define( "decoderExample", "ajax", {
        url: "/myAjaxUrl",
        type: "POST",
        decoder: "appEnvelope" // <--- a function name(string) and not a function.
    });
    
    amplify.request({
        resourceId: "decoderExample",
        success: function( data ) {
            data.foo; // bar
        },
        error: function( message, level ) {
            alert( "always handle errors with alerts." );
        }
    });
    
    amplify.request.decoders.appEnvelope=
    函数(数据、状态、xhr、成功、错误){
    如果(data.status==“成功”){
    成功(data.data);
    }else if(data.status==“fail”| | data.status==“error”){
    错误(data.message、data.status);
    }否则{
    错误(data.message,“致命”);
    }
    };
    expndtw.request.define(“decodexample”,“ajax”{
    url:“/myAjaxUrl”,
    类型:“POST”,
    解码器:“appEnvelope”/好的,算出了

    这一部分吸引了我的眼球

    beforeSend : function( _xhr, _ajaxSettings ) {
    
                    xhr = _xhr;
                    ajaxSettings = _ajaxSettings;
                    var ret = defnSettings.beforeSend ?
                        defnSettings.beforeSend.call( this, ampXHR, ajaxSettings ) : true;
                    return ret && amplify.publish( "request.before.ajax",
                        defnSettings, settings, ajaxSettings, ampXHR );
                }
            });
    
    amplify.subscribe( "request.before.ajax", function( resource, settings, ajaxSettings, ampXHR ) {
    var _success = ampXHR.success,
        _error = ampXHR.error,
        decoder = $.isFunction( resource.decoder )
            ? resource.decoder
            : resource.decoder in amplify.request.decoders
                ? amplify.request.decoders[ resource.decoder ]
                : amplify.request.decoders._default;
    
    if ( !decoder ) {
        return;
    }
    
    function success( data, status ) {
        _success( data, status );
    }
    function error( data, status ) {
        _error( data, status );
    }
    ampXHR.success = function( data, status ) {
        decoder( data, status, ampXHR, success, error );
    };
    ampXHR.error = function( data, status ) {
        decoder( data, status, ampXHR, success, error );
    };
    
    amplify.request.define("testRequest", "ajax", {
    
    url: "/echo/json/",
    dataType: 'json',
    type: 'POST',
    decoder: function(data, status, xhr, success, error) {
        console.log('decoder fired');
        $('.messages').append('<div>decoder fired </div>');
        success(data);
    },
    beforeSend: function(xhr){
    //not doing anything here, just logging;
        console.log('before send fired');
        $('.messages').append('<div>before send fired </div>');
        return true; //this is the key
    }
    

    请注意,如果指定了它,它将在发送前调用,否则将设置
    var ret
    设置为
    true

    如果设置为true,它将发布
    “request.before.ajax”

    在文件的下面,放大监听此消息

    beforeSend : function( _xhr, _ajaxSettings ) {
    
                    xhr = _xhr;
                    ajaxSettings = _ajaxSettings;
                    var ret = defnSettings.beforeSend ?
                        defnSettings.beforeSend.call( this, ampXHR, ajaxSettings ) : true;
                    return ret && amplify.publish( "request.before.ajax",
                        defnSettings, settings, ajaxSettings, ampXHR );
                }
            });
    
    amplify.subscribe( "request.before.ajax", function( resource, settings, ajaxSettings, ampXHR ) {
    var _success = ampXHR.success,
        _error = ampXHR.error,
        decoder = $.isFunction( resource.decoder )
            ? resource.decoder
            : resource.decoder in amplify.request.decoders
                ? amplify.request.decoders[ resource.decoder ]
                : amplify.request.decoders._default;
    
    if ( !decoder ) {
        return;
    }
    
    function success( data, status ) {
        _success( data, status );
    }
    function error( data, status ) {
        _error( data, status );
    }
    ampXHR.success = function( data, status ) {
        decoder( data, status, ampXHR, success, error );
    };
    ampXHR.error = function( data, status ) {
        decoder( data, status, ampXHR, success, error );
    };
    
    amplify.request.define("testRequest", "ajax", {
    
    url: "/echo/json/",
    dataType: 'json',
    type: 'POST',
    decoder: function(data, status, xhr, success, error) {
        console.log('decoder fired');
        $('.messages').append('<div>decoder fired </div>');
        success(data);
    },
    beforeSend: function(xhr){
    //not doing anything here, just logging;
        console.log('before send fired');
        $('.messages').append('<div>before send fired </div>');
        return true; //this is the key
    }
    
    }))

    因此,如果你有一个beforeSend,如果它没有返回true,消息永远不会被发布,解码器也永远不会被点击

    解决方案是什么

    从beforeSend函数返回true

    beforeSend : function( _xhr, _ajaxSettings ) {
    
                    xhr = _xhr;
                    ajaxSettings = _ajaxSettings;
                    var ret = defnSettings.beforeSend ?
                        defnSettings.beforeSend.call( this, ampXHR, ajaxSettings ) : true;
                    return ret && amplify.publish( "request.before.ajax",
                        defnSettings, settings, ajaxSettings, ampXHR );
                }
            });
    
    amplify.subscribe( "request.before.ajax", function( resource, settings, ajaxSettings, ampXHR ) {
    var _success = ampXHR.success,
        _error = ampXHR.error,
        decoder = $.isFunction( resource.decoder )
            ? resource.decoder
            : resource.decoder in amplify.request.decoders
                ? amplify.request.decoders[ resource.decoder ]
                : amplify.request.decoders._default;
    
    if ( !decoder ) {
        return;
    }
    
    function success( data, status ) {
        _success( data, status );
    }
    function error( data, status ) {
        _error( data, status );
    }
    ampXHR.success = function( data, status ) {
        decoder( data, status, ampXHR, success, error );
    };
    ampXHR.error = function( data, status ) {
        decoder( data, status, ampXHR, success, error );
    };
    
    amplify.request.define("testRequest", "ajax", {
    
    url: "/echo/json/",
    dataType: 'json',
    type: 'POST',
    decoder: function(data, status, xhr, success, error) {
        console.log('decoder fired');
        $('.messages').append('<div>decoder fired </div>');
        success(data);
    },
    beforeSend: function(xhr){
    //not doing anything here, just logging;
        console.log('before send fired');
        $('.messages').append('<div>before send fired </div>');
        return true; //this is the key
    }
    
    amplify.request.define(“testRequest”、“ajax”{
    url:“/echo/json/”,
    数据类型:“json”,
    键入:“POST”,
    解码器:功能(数据、状态、xhr、成功、错误){
    log('decoder fired');
    $('.messages').append('decoder fired');
    成功(数据);
    },
    发送前:函数(xhr){
    //这里什么都不做,只是记录;
    log('before send fired');
    $('.messages').append('before send fired');
    return true;//这是密钥
    }
    
    }))


    工作起来很有魅力!希望这能帮助其他人找到答案

    谢谢Stefan的回复。我的资料也来自他们的文档,正如我所说的,除了在请求中有beforeSend外,一切都很好。这就是它不触发解码器的地方。因此,你的回答没有帮助(这确实帮了我的忙,谢谢。就我而言,我在尝试定义自定义缓存时遇到了同样的问题。找不到任何涉及此问题的文档。感谢您发布您的研究!