【问题标题】:calling a function having callback in for loop在 for 循环中调用具有回调的函数
【发布时间】:2016-01-17 03:21:57
【问题描述】:

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

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;
        });
    }

如何防止在获得所有条目之前调用回调。

【问题讨论】:

  • 您当前的示例已损坏,您缺少属于window.resolveLocalFileSystemURI)
  • thnx@DoXicK 是打字问题。请告诉我如何实现我的要求。
  • 你能先把这里的代码修一下吗?
  • 请检查它是否存在。
  • 代码仍然不完整,甚至无法运行。无论如何,我会给你一个关于如何做到这一点的线索,这样你就可以在你自己的代码中实现它。 实际上:代码很好。只是可怕的格式

标签: javascript jquery-callback


【解决方案1】:

有多种主要方法可以解决这样的问题:

  1. 异步循环的手动编码
  2. 使用 Promise 协调多个异步操作
  3. 使用 Async 之类的库来协调多个异步操作

这是手动版本:

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
});

【讨论】:

    【解决方案2】:

    这一切都基于您的所有功能都是同步的,如果不是:请更具体地说明您正在使用什么。 (这里没有 jQuery,但你的标签说 jquery)

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

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多