2016-08-16 13 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())resolve()は動作しません。

なぜですか?再帰的約束を解決するにはどうしたらいいですか?

+0

'checkIfFileExist(newFilename);'を 'addNumberToFilename'関数で' return checkIfFileExist(newFilename); 'に変更しましたが動作しません。 – 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