我有以下功能,我按顺序进入控制台false
然后true
。 true
在false
之后1-2秒。如果没有上传文件,我需要该函数返回false。
function uploadFeaturedImg()
{
var uploaded = false,
files = featuredImg.files;
if (files.length > 0)
{
for (var i = 0, len = files.length; i < len; i++)
{
var params = {
Key: 'tournament/image/'+files[i].name,
ContentType: files[i].type,
Body: files[i]
};
bucket.upload(params, function(err, data)
{
if (!err)
{
if (!uploaded) uploaded = true;
console.log(uploaded);
}
else
{
fileAlert(files[i].name);
}
});
}
}
console.log(uploaded);
return uploaded;
};
答案 0 :(得分:0)
我最终使用了另一种对我有用的方法。
我还使用.ajaxStop()
:https://api.jquery.com/ajaxStop/。这基本上让我知道所有文件上传的时间(如果有的话)。
答案 1 :(得分:-1)
这里有一个异步问题:
进行循环时,每次迭代都会调用带有回调的函数bucket.upload
(当操作完成时将调用它)。但是当你完成最后一次调用yo bucket.upload
时,你的循环结束了,但是当所有的回调都完成时,你的循环就结束了。
所以你返回的行叫做BEFORE所有的回调。
如果你能理解这一点,你也可以理解asyncron函数永远不会返回某些东西(因为函数必须在结束之前等待某事)但是在完成所有操作后调用回调函数。 (在这种情况下是回调参数)
要正常工作,您必须使用像async
(Doc here)
使用它:
if (files.length > 0) {
async.each(
files,
function(file, cb) {
// This function will be called for each iteration
// ...
// Call your funciton here
bucket.upload(params, function(err, data) {
// When the callback is done, call the end for the iteration
cb();
}
},
function(err) {
// This function is called only when ALL callback are done.
callback(true); // All upload are done correctly
});
);
}
else {
// No files to upload
callback(false);
}
答案 2 :(得分:-2)
嗯,处理异步代码总是有点复杂。
您应该更改方法并在方法的签名中传递回调函数:
function uploadFeaturedImg(callback)
{
var uploaded = false,
files = featuredImg.files;
if (files.length > 0)
{
for (var i = 0, len = files.length; i < len; i++)
{
var params = {
Key: 'tournament/image/'+files[i].name,
ContentType: files[i].type,
Body: files[i]
};
bucket.upload(params, function(err, data)
{
if (!err)
{
if (!uploaded) uploaded = true;
if(callback) callback(); //Do what you were supposed to do with the result of your function in this callback function
}
else
{
fileAlert(files[i].name);
}
});
}
}
return uploaded;
};