2016-08-16 2 views
0

У меня есть код, как показано ниже:Как решить рекурсивное обещание?

function addNumberToFilename(filename) { 
 
    var newFilename = ""; 
 
    var textInsideParentheses = filename.match(/\(([^)]+)\)/); 
 
    if (textInsideParentheses !== null && textInsideParentheses[1] !== undefined) { 
 
     // have parentheses 
 
     var numInParentheses = parseInt(textInsideParentheses[1]); 
 
     var nextNumInParentheses = numInParentheses + 1; 
 
     newFilename = filename.replace(/\(.*?\)/, String('(' + nextNumInParentheses + ')')) 
 
    } else { 
 
     // have not parentheses 
 
     var reForExtensionExtract = /(?:\.([^.]+))?$/; 
 
     var extension = reForExtensionExtract.exec(filename)[1]; 
 
     var fileNameWithoutExtenstion = filename.replace(/\..+$/, ''); 
 
     newFilename = fileNameWithoutExtenstion + '(1)' + '.' + extension; 
 
    } 
 

 
    checkIfFileExist(newFilename); 
 
} 
 

 

 
function checkIfFileExist(filename, path) { 
 
    return new Promise(function(resolve, reject) { 
 
     var fileWithThatFilenameFound = false; 
 
     local.files.listFolder({ 
 
      "path": "default:\\", 
 
      "filter": ["Img"] 
 
     }, { 
 
      success: function (result) { 
 
       result.map(function (elem) { 
 
        if (elem.itemName === filename) { // file with that filename exists 
 
         // so add parentheses or increase them 
 
         fileWithThatFilenameFound = true; 
 
         addNumberToFilename(filename); 
 
        } 
 
       }); 
 

 
       if (!fileWithThatFilenameFound) { 
 
        // end of the recursion chain! let's resolve finally 
 
        resolve(filename); 
 
       } 
 
      } 
 
     }); 
 
    }); 
 
} 
 

 

 
... 
 

 

 
checkIfFileExist(snapshot.filename + '.jpg').then(function(newFileName) { 
 
    local.images.save({ 
 
     fileName: newFileName 
 
    }) 
 
});

Но у меня есть проблема с этим.

Если нет рекурсии вообще (имя файла не существует, поэтому решение выполняется в рамках первого обещания), все работает. Но если имя файла существует (и цепочка - checkIfFileExist -> addNumberToFilename -> checkIfFileExist -> resolve()), то разрешение() не работает.

Почему? Как я могу решить рекурсивное обещание?

+0

Я изменил 'checkIfFileExist (newFilename);' to 'return checkIfFileExist (newFilename);' в 'addNumberToFilename', но это не сработает. – bialasikk

ответ

0

Потому что вы должны вернуть свои обещания:

function addNumberToFilename(filename) { 

    //... 
    return checkIfFileExist(newFilename); 
} 

и

checkIfFileExist(snapshot.filename + '.jpg') 
    .then((fileName) => local.images.save({ fileName })) 

отредактирован после комментария:

function checkIfFileExist(filename) { 
    //simplyfied a bit 
    return new Promise(function (resolve, reject) { 
     resolve false; 
    }) 
} 

function saveFile(newFileName) { 

    return local.images.save({ 
     fileName: newFileName 
    }) 
    // the second argument wasn't useful at all 
} 

function save() { 

    return checkIfFileExist(snapshot.filename + '.jpg') 
     .then(saveFile) 
     .catch(err => console.error(err)) 
} 

Я вижу много проблем, разбросанных вокруг:

  • local.images.save - это функция?
  • Он возвращает обещание?
  • Выполнение обещания?
+0

Не работает. Мой код на основном вызове checkIfFileExist: https://jsfiddle.net/pv92v9h0/ – bialasikk

Смежные вопросы