繁体   English   中英

如何解决递归承诺?

[英]How to resolve recursive promise?

我有如下代码:

 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()不起作用。

为什么? 如何解决递归承诺?

因为您必须兑现您的承诺:

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是一个函数吗?
  • 它返回一个承诺?
  • 诺言兑现?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM