我想知道为什么在我的示例#1中警报以正确的顺序触发1,2,但是在示例#2中我添加了ajax调用,然后触发顺序变为2,1。也有人可以建议如何使用ajax调用我可以达到1,2的所需点火顺序......我很难过。
示例#1
uploader.bind('BeforeUpload', function (up, file, policy, sinature) {
//alert('1');
test();
function test() {
alert('1');
}
});
uploader.bind('UploadFile', function (up, file, policy, signature) {
test2();
function test2() {
alert('2');
}
});
示例#2
uploader.bind('BeforeUpload', function (up, file, policy, sinature) {
//alert('1');
test();
function test() {
data = { alc: 'private', bucket: 'PhotojimaDev', file: file.name, key: path };
$.ajax({
url: sf.getServiceRoot('photojima') + "Upload/getPolicy",
type: 'POST',
data: data,
beforeSend: sf.setModuleHeaders
}).done(function (response, status) {
if (status == "success") {
policy = response.policy;
signature = response.signature;
alert('1');
}
}).fail(function (xhr, result, status) {
alert("Uh-oh, something broke: " + status);
});
}
});
uploader.bind('UploadFile', function (up, file, policy, signature) {
test2();
function test2() {
alert('2');
}
});
答案 0 :(得分:1)
BeforeUpload
中的ajax创建了一个非阻塞的后台工作程序,显然在UploadFile
之后才会完成
如果您需要BeforeUpload
先完成,那么您必须通过添加$.ajax
async = false
不能异步运行
function test() {
data = { alc: 'private', bucket: 'PhotojimaDev', file: file.name, key: path };
$.ajax({
async: false,
url: sf.getServiceRoot('photojima') + "Upload/getPolicy",
type: 'POST',
data: data,
beforeSend: sf.setModuleHeaders
}).done(function (response, status) {
if (status == "success") {
policy = response.policy;
signature = response.signature;
alert('1');
}
}).fail(function (xhr, result, status) {
alert("Uh-oh, something broke: " + status);
});
}
在手动中搜索异步:http://api.jquery.com/jQuery.ajax/
答案 1 :(得分:0)
ajax
默认为asyn,因此发送ajax请求,然后执行之后的代码
所以在第二种情况下你得到2,1,因为只有在ajax请求success response
要获得所需的1,2执行,您可以从成功处理程序中调用函数test2()
或者只是让ajax请求同步。这可以在发送ajax请求时设置async to false
。但不建议