【发布时间】:2015-08-28 16:29:23
【问题描述】:
这是我得到的:
function nextAvailableFilename(path) {
return new Promise(function (resolve, reject) {
FileSystem.exists(path, function (exists) {
if (!exists) return resolve(path);
var ext = Path.extname(path);
var pathWithoutExt = path.slice(0, -ext.length);
var match = /\d+$/.exec(pathWithoutExt);
var number = 1;
if (match) {
number = parseInt(match[0]);
pathWithoutExt = pathWithoutExt.slice(0, -match[0].length);
}
++number;
nextAvailableFilename(pathWithoutExt + number + ext).then(function () {
return resolve.apply(undefined, arguments);
}, function () {
return reject.apply(undefined, arguments);
});
});
});
}
但我不喜欢最后的那个块 - 有没有办法用堆栈中的下一个“替换”当前承诺,而不是像我在这里所做的那样让一个承诺解决下一个承诺?
【问题讨论】:
-
你可以创建一个包装对象,它只有一堆承诺,处理实际的解决/拒绝,然后继续下一个承诺
-
@MiltoxBeyond 我不确定我是否理解您要说的内容。我应该创建一个单独的对象来维护一个堆栈,并或多或少地解决/拒绝它们我现在做了什么?这会带来什么好处?
-
它本质上是美观的,但你确实有更清晰的代码的好处,所以它应该很容易理解,如果你使用内存使用更轻的原型
-
你为什么不只是链接承诺?
-
没问题,只是提到它以防效率很重要。如果有很多冲突的文件,则通过执行
fs.readdir()并查看该数组以查找最佳文件名来尝试下一个尝试可能会更有效,因为您可以使用该文件调用跳过所有现有名称。