Jquery 在发送之前使用JS解码器和ajax
好的,正在准备放大解码器。奇怪的问题。如果我有一个beforeSend附加到我的请求,解码器不会启动。删除beforeSend,解码器将启动 下面是两个例子Jquery 在发送之前使用JS解码器和ajax,jquery,amplifyjs,Jquery,Amplifyjs,好的,正在准备放大解码器。奇怪的问题。如果我有一个beforeSend附加到我的请求,解码器不会启动。删除beforeSend,解码器将启动 下面是两个例子 没有事先发送 在发送之前 有人能告诉我发生了什么事吗?如果我有一个beforeSend,为什么解码器不能工作?我假设解码器应该在收到请求后启动,所以beforeSend应该不会对其产生任何影响 注意:stackoverflow希望我在这里发布代码,而不仅仅是小提琴 beforeSend : function( _xhr, _ajaxS
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外,一切都很好。这就是它不触发解码器的地方。因此,你的回答没有帮助(这确实帮了我的忙,谢谢。就我而言,我在尝试定义自定义缓存时遇到了同样的问题。找不到任何涉及此问题的文档。感谢您发布您的研究!