返回功能值AFTER for-loop结束

时间:2015-05-26 16:56:52

标签: javascript function for-loop asynchronous return

我有以下功能,我按顺序进入控制台false然后truetruefalse之后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;
};

3 个答案:

答案 0 :(得分:0)

我最终使用了另一种对我有用的方法。

我还使用.ajaxStop()https://api.jquery.com/ajaxStop/。这基本上让我知道所有文件上传的时间(如果有的话)。

答案 1 :(得分:-1)

这里有一个异步问题:

进行循环时,每次迭代都会调用带有回调的函数bucket.upload(当操作完成时将调用它)。但是当你完成最后一次调用yo bucket.upload时,你的循环结束了,但是当所有的回调都完成时,你的循环就结束了。

所以你返回的行叫做BEFORE所有的回调。

如果你能理解这一点,你也可以理解asyncron函数永远不会返回某些东西(因为函数必须在结束之前等待某事)但是在完成所有操作后调用回调函数。 (在这种情况下是回调参数)

要正常工作,您必须使用像asyncDoc 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;
};