2016-08-16 6 views
0

Ich habe Code wie unten:Wie rekursive Versprechen zu lösen?

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

Aber ich habe Problem.

Wenn es überhaupt keine Rekursion gibt (Dateiname nicht vorhanden, also Auflösung ist Ausführung innerhalb der ersten Versprechung), funktioniert alles. Wenn aber der Dateiname existiert (und die Kette ist checkIfFileExist -> addNumberToFilename -> checkIfFileExist -> resolve()), funktioniert resolve() nicht.

Warum? Wie kann ich rekursive Versprechen lösen?

+0

Ich habe 'checkIfFileExist (newFilename);' geändert, um 'checkIfFileExist (newFilename);' in 'addNumberToFilename' -Funktion zurückzugeben, aber es funktioniert nicht. – bialasikk

Antwort

0

Da müssen Sie Ihre Versprechen zurück:

function addNumberToFilename(filename) { 

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

und

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

nach dem Kommentar bearbeitet:

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

Ich sehe viele Probleme verstreut:

  • local.images.save ist eine Funktion?
  • gibt es ein Versprechen?
  • das Versprechen erfüllt?
+0

Es funktioniert nicht. Mein Code für den Aufruf von checkIfFileExist lautet: https://jsfiddle.net/pv92v9h0/ – bialasikk

Verwandte Themen