2016-01-15 8 views
-1

Я хочу запустить 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; 
     }); 
    } 

Как предотвратить вызов callback до того, как я получу все записи.

+0

текущий пример сломана, вы пропускаете ')' 'принадлежность к window.resolveLocalFileSystemURI' – DoXicK

+0

thnx @ DoXicK, который печатает проблему. Pls говорит мне, как реализовать то, что я спросил. –

+0

Вы можете исправить код здесь? – DoXicK

ответ

0

Есть несколько основных способа атаковать проблему так:

  1. Ручное кодирование асинхронного цикла
  2. Использование обещаний координировать несколько асинхронных операций
  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 
}); 
+0

@ jfiend00 thnx :) .. использовал ручной подход и работал для меня –

-1

все это основано на том, что все ваши функции синхронны, а если нет: будьте более конкретными, что вы используете. (Нет JQuery здесь пока ваши теги говорят JQuery)

function resolveFile(path) { 
    var result; 
    window.resolveLocalFileSystemURI(path, function(file) { 
     result = file; 
    }); 
    return file; 
} 
var resolvedFiles = filesarr.map(resolveFile); 
callback(resolvedFiles); 
Смежные вопросы