JavaScript:重试异步readFile()函数

JavaScript:重试异步readFile()函数,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,我想用javascript读取一个文件。此文件必须先下载,不能立即使用。这意味着,如果使用readFile()访问此文件失败并最终进入catch块,则应重复此操作 const fse = require('fs-extra') let retries = 0 function read_a_file(path) { return fse.readFile(path) .catch(error => { if (retries < 5)

我想用javascript读取一个文件。此文件必须先下载,不能立即使用。这意味着,如果使用readFile()访问此文件失败并最终进入catch块,则应重复此操作

const fse = require('fs-extra')

let retries = 0
function read_a_file(path) {
    return fse.readFile(path)
        .catch(error => {
            if (retries < 5) {
                retries++
                console.log('Retry', retries)
                setTimeout(() => read_a_file(path), 1000);
            } else {
                console.log(error.message)
            }
        })
}

read_a_file('path/to/file').then(content => {
    console.log('Content:', content)
})

我现在希望在所有重试结束时输出内容(在本例中为未定义)。为什么要在第一次重复之前发出它?

您使用的是
。然后只在第一次调用中发出
,因此内容记录功能只能工作一次

read_a_file('path/to/file').then(content => {
    console.log('Content:', content)
})

对该函数的另一个调用是
setTimeout(()=>read\u a\u file(path),1000)
,如果您添加了一个
。然后在该
之后,它还将在其他问题解决后记录它。您将获得其中的5个输出。

您正在setTimeout中创建与您返回的初始承诺无关的新承诺

我会信守诺言,并把它还给你。readFile将调用该承诺的resolve或reject

const fse=require('fs-extra'))
函数读取文件(路径){
让重试次数=0
常量读取文件(解析、拒绝){
读取文件(路径)
.然后(解决)
.catch(错误=>{
如果(重试次数<5次){
重试++
console.log('重试',重试次数)
setTimeout(()=>readFile(解析、拒绝),1000);
}否则{
console.log(错误消息)
拒绝(错误);
}
})
}
返回新承诺((resolve,reject)=>readFile(resolve,reject));
}
读取文件('path/to/file')
。然后(内容=>{
console.log('Content:',Content)
})
.catch(e=>{
控制台日志(e);
})

我假设这是第一次承诺的回报。
设置超时(()=>读取文件(路径),1000)创建一个新的承诺,而不使用
然后

read_a_file('path/to/file').then(content => {
    console.log('Content:', content)
})