Good day,
I want a function to check if there are any files inside a folder, if there is no folder, make the folder and then run itself (function) again.
const fs = require('fs');
const writeFileAtomic = require('write-file-atomic');
class DataHandler {
constructor() {
}
}
DataHandler.prototype.checkDB = function() {
return new Promise((resolve, reject) => {
fs.readdir('./database', function (err, files) {
if (err) {
if (err.code = 'ENOENT') {
fs.mkdir('./database', () => {
return this.checkDB;
})
} else {
reject();
}
}
if (files) {
console.log(files)
}
})
})
}
module.exports = DataHandler;
I get errors using this, saying this.checkDB is not a function
CodePudding user response:
The fix maybe is to save this in a variable:
DataHandler.prototype.checkDB = function() {
var dataHandler = this;
return new Promise((resolve, reject) => {
fs.readdir('./database', function (err, files) {
if (err) {
if (err.code = 'ENOENT') {
fs.mkdir('./database', () => {
return dataHandler.checkDB;
})
} else {
reject();
}
}
if (files) {
console.log(files)
}
})
})
}
A VERY basic explanation:
In javascript, when you put this inside of a function(){} it gets assigned to that function's object. Then, when you called fs.readdir(...., function(... { ... the keyword/variable this was binded to that function()'s object.. I recommend you this read: this - JavaScript | MDN
That binding does not happen with arrow functions, so, if you're curious there's another fix for your problem. You would need to replace function (err, files) with (err, files) =>, like this:
DataHandler.prototype.checkDB = function() {
return new Promise((resolve, reject) => {
fs.readdir('./database', (err, files) => {
if (err) {
if (err.code = 'ENOENT') {
fs.mkdir('./database', () => {
return this.checkDB;
})
} else {
reject();
}
}
if (files) {
console.log(files)
}
})
})
}
CodePudding user response:
Seems like the object this refers to the Object created with the new Promise(.. I would suggest to log.console(this) and check what it contains
