在for循环中调用具有回调的函数

时间:2016-01-15 09:58:00

标签: javascript jquery-callback

我希望在window.resolveLocalFileSystemURI(file,success,fail)循环中运行for传递不同的文件条目,并且只有在我获得所有条目后才想在数组中返回已解析的条目。

function resolveFiles(result,callback)
{
    var resultData=[]
    window.resolveLocalFileSystemURI(result, function(entry)
    {
        resolvedGalleryImages.push(entry);

        callback(resolvedGalleryImages);
        resolvedGalleryImages=[];

    }, function(e)
    {
        alert("err"+e);}); 
    }

    //calling--
    //@filesarr has captured images uris
    for(i = 0; i < filesarr.length; i++)
    {
        resolveFiles(filesarr[i],function(result){
            var resultArr = result;
        });
    }

如何在收到所有条目之前阻止回调。

2 个答案:

答案 0 :(得分:0)

有多种主要方法可以解决此类问题:

  1. 异步循环的手动编码
  2. 使用promises协调多个异步操作
  3. 使用像Async这样的库来协调多个异步操作
  4. 以下是手册版本:

    function getFiles(filesarr, doneCallback) {
        var results = new Array(filesarr.length);
        var errors = new Array(filesarr.length);
        var errorCnt = 0;
        var overallCnt = 0;
    
        function checkDone() {
            if (overallCnt === filesarr.length) {
                if (errorCount) {
                    doneCallback(errors, results);
                } else {
                    doneCallback(null, results);
                }
            }
        }
    
        for (var i = 0; i < filesarr.length; i++) {
            (function(index) {
                window.resolveLocalFileSystemURI(url, function (entry) {
                    results[index] = entry;
                    ++overallCnt;
                    checkDone();
                }, function (e) {
                    errors[index] = e;
                    ++errorCount;
                    ++overallCnt;
                    checkDone();
                });
            })(i);
        }
    }
    
    getFiles(filesarr, function(errArray, results) {
        if (errArray) {
            // go errors here
        } else {
            // process results
        }
    });
    

    而且,这是一个使用ES6承诺的版本:

    // make a promisified function
    function resolveFile(url) {
        return new Promise(function(resolve, reject) {
            window.resolveLocalFileSystemURI(url, resolve, reject);
        });
    }
    
    function getFiles(filesarr) {
        var promises = [];
        for (var i = 0; i < filesarr.length; i++) {
            promises.push(resolveFile(filesarr[i]));
        }
        return Promise.all(promises);
    }
    
    getFiles(filesarr).then(function(results) {
        // process results here
    }, function(err) {
        // error here
    });
    

答案 1 :(得分:-1)

这完全基于您的所有功能是同步的,如果不是:更具体的是您正在使用的功能。 (这里没有jQuery你的标签说jquery)

function resolveFile(path) {
    var result;
    window.resolveLocalFileSystemURI(path, function(file) {
        result = file;
    });
    return file;
}
var resolvedFiles = filesarr.map(resolveFile);
callback(resolvedFiles);