Javascript 承诺链则无法实现
很难弄清楚为什么“describeDir”承诺链无法实现。。有人知道我搞砸了什么吗?所有的代码似乎都在执行,但是任何promise api函数(如then或finally)都不会执行。下面显示了两个顶级功能。github回购协议位于Javascript 承诺链则无法实现,javascript,promise,Javascript,Promise,很难弄清楚为什么“describeDir”承诺链无法实现。。有人知道我搞砸了什么吗?所有的代码似乎都在执行,但是任何promise api函数(如then或finally)都不会执行。下面显示了两个顶级功能。github回购协议位于 首先,要检查是否有拒绝,请尝试 docProcessor.describeDir(folder, path.join(__dirname, '..')) .then(value => console.log('docProcessor then entered
首先,要检查是否有拒绝,请尝试
docProcessor.describeDir(folder, path.join(__dirname, '..'))
.then(value => console.log('docProcessor then entered:', value))
.catch(reason => console.error('error', reason);
describeDir
中的一个潜在问题是,您使用循环过滤掉名为@HW
@LIBS
@ROOT
或run
的文件
当您在k
上拼接文件数组时,k++
仍会执行,因此您将跳过测试下一个文件
i、 e
因此,如果一行中有两个文件包含其中一个字符串,您将跳过“删除”它-这可能是问题所在
你想改用过滤器吗
function describeDir(filedir, outdir) {
var files = findFilesInDir(filedir, '.XML')
.filter(file =>
file.indexOf('@HW') == -1 &&
file.indexOf('@LIBS') == -1 &&
file.indexOf('@ROOT') == -1 &&
file.indexOf('run') == -1
);
return Promise.each(files, file => updateDescriptor(file, path.basename(file), outdir));
}
还是整洁
function describeDir(filedir, outdir) {
var files = findFilesInDir(filedir, '.XML')
.filter(file => !/@HW|@LIBS|@ROOT|run/.test(file));
return Promise.each(files, file => updateDescriptor(file, path.basename(file), outdir));
}
作为奖励,以下是updateDescriptor
功能,该功能经过清理、扁平化,并采用最新的ES2015+编码功能进行了现代化改造(您的评论保持不变)
请注意缺少catch
code,因为您希望错误在整个链中持续存在
updateDescriptor
的真正精简版本是
const updateDescriptor = (fileloc, wsName, outdir) => getDescriptor(outdir)
.then(value => Promise.all([getComments(fileloc), getVariables(fileloc), value]))
.then(([comments, variables, descriptorFile]) =>
saveDescriptor(Object.assign(descriptorFile, {
[wsName] : { comments, variables }
}), outdir)
);
您是否可以包括或指出您试图
然后承诺链的行?您是否有任何错误?我猜您在某处有错误。基本代码为我编写了unshawn函数定义为“return-Promise.resolve('xxx')”。当你抓住了一个承诺,如果你想让它被接受,你就必须把这个错误冒出来。例如,如果saveDescriptor
抛出错误,您将永远不会调用resolve
,并且顶级承诺也永远不会得到解决或拒绝。您可能应该在所有这些catch块中调用reject
。descripebdir
返回一个Promise。顺便说一句,每个-解析为文件
,“thenable”也是如此-在docProcessor上尝试一个.catch
。描述IR
以查看是否发生拒绝。顺便说一句,拼接的for循环是一个问题雷区,因为每次拼接时您都会“错过”测试条目k+1
-使用过滤器代替感谢反馈,这是对我的代码的极大改进。信不信由你,调用describeDir时,我仍然没有得到捕获或执行,尽管代码仍然在执行。也许在我的代码中有一个更深层次的bug,节点正在吞噬它?在发布更有用的东西之前,我会继续调查
function describeDir(filedir, outdir) {
var files = findFilesInDir(filedir, '.XML')
.filter(file =>
file.indexOf('@HW') == -1 &&
file.indexOf('@LIBS') == -1 &&
file.indexOf('@ROOT') == -1 &&
file.indexOf('run') == -1
);
return Promise.each(files, file => updateDescriptor(file, path.basename(file), outdir));
}
function describeDir(filedir, outdir) {
var files = findFilesInDir(filedir, '.XML')
.filter(file => !/@HW|@LIBS|@ROOT|run/.test(file));
return Promise.each(files, file => updateDescriptor(file, path.basename(file), outdir));
}
function updateDescriptor(fileloc, wsName, outdir) {
console.log('Updating descriptor file for: ' + wsName);
return getDescriptor(outdir)
.then(value => Promise.all([getComments(fileloc), getVariables(fileloc), value]))
.then(([comments, variables, descriptorFile]) => {
//var descriptor = new Object();
//console.log(JSON.stringify(descriptor));
//console.log(JSON.stringify(descriptor));
//descriptorFile[wsName] = new Object();
//var worksheet = new Object();
descriptorFile[wsName] = {comments, variables};
//save the file
return saveDescriptor(descriptorFile, outdir)
}).then((value) => {
console.log('Completed ' + wsName + ' ' + value);
return value
})
}
const updateDescriptor = (fileloc, wsName, outdir) => getDescriptor(outdir)
.then(value => Promise.all([getComments(fileloc), getVariables(fileloc), value]))
.then(([comments, variables, descriptorFile]) =>
saveDescriptor(Object.assign(descriptorFile, {
[wsName] : { comments, variables }
}), outdir)
);