Javascript 承诺链则无法实现

Javascript 承诺链则无法实现,javascript,promise,Javascript,Promise,很难弄清楚为什么“describeDir”承诺链无法实现。。有人知道我搞砸了什么吗?所有的代码似乎都在执行,但是任何promise api函数(如then或finally)都不会执行。下面显示了两个顶级功能。github回购协议位于 首先,要检查是否有拒绝,请尝试 docProcessor.describeDir(folder, path.join(__dirname, '..')) .then(value => console.log('docProcessor then entered

很难弄清楚为什么“describeDir”承诺链无法实现。。有人知道我搞砸了什么吗?所有的代码似乎都在执行,但是任何promise api函数(如then或finally)都不会执行。下面显示了两个顶级功能。github回购协议位于


首先,要检查是否有拒绝,请尝试

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