现在,如果这不是一个奇怪的问题,我不知道是什么。
但问题是:我的“onSelect”选项中有一个函数,必须收集一些数据(通过AJAX),我的“onComplete”选项中有一个函数,它根据数据处理刚上传的文件收集了“onSelect”。
但是,对于非常小的文件,“onSelect”尚未在上传完成之前完成,并且“onComplete”因缺少必要的数据而失败。更大的文件工作正常。
所以,我正在寻找一种方法来阻止文件的上传。只有在onSelect中的函数完成获取必要数据后才能启动它。
有什么想法吗?
以下是onSelect触发的函数示例:
var foo = new Array();
function checkDB( event, queueID , fileObj )
{
$.post( ajax_folder + 'fetchData' ,
{
ref: "someValue"
} ,
function( data ){
foo[ queueID ] = data.result;
} ,
'json' );
return true;
}
答案 0 :(得分:1)
通过重新排序事件解决了这个问题。处理现在在“onAllComplete”中进行,该功能通过setInterval检查Uploadify上传目录中的图片数量与Uploadify注册的上传图片数量相同。一旦两个数字相等,处理就开始了。
答案 1 :(得分:1)
我普遍同意彼得你应该尝试更优雅地利用这些事件。但是,您可以(并且可能应该)将该代码提取到函数中并保留一个标志,告诉您之前是否已调用它。像这样:
var foo = new Array();
var flag = false;
function checkDB()
{
$.post( ajax_folder + 'fetchData' ,
{
ref: "someValue"
} ,
function( data ){
foo[ queueID ] = data.result;
flag = true;
} ,
'json' );
return true;
}
function onSelectHandler(event, queueID , fileObj){
checkDB();
}
function someOnCompleteStuff(){
if(flag){
//do oncomplete stuff
}else{
// try again later
setTimeout(someOnCompleteStuff,500);
}
}
function onCompleteHandler(event, queueID , fileObj){
someOnCompleteStuff();
}
当然你总是可以检查foo的长度而不是使用旗帜。
答案 2 :(得分:0)
如果我理解正确,我认为你可以添加onComplete函数作为onChange函数的回调。这样,onComplete函数只有在onChange完成执行后才会被调用,如:
[...].checkDB( event, queueID, fileObj, function(){
/* the onComplete code goes here*/
});
另外,请查看这两个问题的答案,因为他们似乎已经找到了您正在寻找的解决方案: