为什么" fs.readFile"回调日志文件数据到控制台但不返回相同的数据

时间:2017-05-16 04:58:37

标签: javascript node.js readfile fs

我正在写一个脚本,它会打开我放在特定文件夹中的所有书签。我正在使用" fs" module" readFile"从书签文件中获取数据的方法,以及一些实用程序方法,用于向下钻取数据并构造要打开的URL数组。

我遇到的麻烦是虽然文件数据是可访问的,并且我可以使用我班级中的其他方法来操作它,但我似乎无法从" fs.readFile&返回结果#34;打回来。这是代码(我可以添加其余的类,如果有人会发现有帮助的话)

readBookmarks() {
    fs.readFile(path.join(homeDir() + "/Library/Application " + "Support/Google/Chrome/Default/Bookmarks"),
        (error, data) => {
        if (error) {
            throw error;
        }
        if (data){
            console.log(this.constructUrlList(data)); //outputs an array of urls like I expect
            return this.constructUrlList(data); // returns undefined
        }
    });
}

我觉得我错过了什么。我得到了#34; fs.readFile"是异步的,但是一旦加载文件缓冲区,回调是否只会触发?如果没有,为什么数据可用于" console.log"?

感谢您的帮助

更新:感谢阅读发布的dup jfriend00,我现在理解模块化,异步js的良好模式。这是重构的代码:

openLinks() {
    this.readBookmarks().then((data) => {
        const urlList = this.constructUrlList(data);
        for(let url of urlList) {
            opn(url, {app: 'Safari'});
        }
        process.exit();
    }).catch((error) => {
        console.error("Unable to read the file due to error: " + error.stack);
    })
}

readBookmarks() {
    return new Promise((resolve, reject) => {
        fs.readFile(path.join(homeDir(), "/Library/Application Support/Google/Chrome/Default/Bookmarks"),
            (error, data) => {
            error ? reject(error) : resolve(data);
        });
    });
}

0 个答案:

没有答案