Читать файлы из каталога, используя обещания П2


Продолжение читать файлы из каталога, используя обещания

Удалены exists() и заменить stat() Так что я могу проверить, если файл читается, прежде чем продолжить.

console.log("Hi");
const fs = require('fs');
const { promisify } = require('util');

function mystat(file) {
    return new Promise(function(resolve, reject) {
        console.log(file);
        fs.stat(file, function(err, stat) {
            if (err) {
                reject(err);
            }
            else {
                console.log("Returning Obj");
                resolve({stat: stat, file: file});
            }
        });
    });
}



readdir     = promisify(fs.readdir);
readFile    = promisify(fs.readFile);
writeFile   = promisify(fs.writeFile);

readdir(".")
.then(files => mystat(files[0]))
.then(data  => {if (!(data.stat.mode | fs.S_IRWXO)) { throw "Not Readable";} return readFile(data.file)})
.then(content => writeFile('Test', content))
.then(() => console.log("It worked"))
.catch(err => console.log("Error: " + err));

Для передачи параметров через, например файл передается через стат функции читать; мне нужно, чтобы определить свою собственную функцию, так что я могу передать объект). Есть ли лучший способ сделать это?



581
1
задан 23 марта 2018 в 07:03 Источник Поделиться
Комментарии
1 ответ

Во-первых, асинхронный код не является обязательным требованием для всех код Node.js . Это зависит от варианта использования. Асинхронный код имеет смысл, если вы хотите обслуживать несколько вещей одновременно (т. е. HTTP-серверов, тестировать бегунов и т. д.). но не имеет смысла для одного-запустить скрипт-й вещи (т. е. инструмент командной строки, эшафот генератор и т. д.).

Случае выше попадает во вторую категорию, простой, один-бегите, непараллельной, неинтенсивной эксплуатации. Это означает, что вы можете уйти с синхронной версии одних и тех же операций, которые не требуют обещаний.

const { readdirSync, statSync, readFileSync, writeFileSync } = require('fs');

readdirSync('.')
.slice(0, 1)
.map(file => ({ stat: statSync(f), file }))
// If you know it's not readable, just don't proceed.
.filter(data => (data.stat.mode | fs.S_IRWXO))
.map(data => readFileSync(data.file))
.forEach(content => writeFileSync('test', content))

// If it made it all the way here, it worked. If something threw up,
// it should have halted the script somewhere in the middle.
console.log("It worked")

Теперь, если вы действительно хотите асинхронного кода, узел поддерживает async/await. Это по сути синтаксический сахар для обещаний, где асинхронные функции возвращают обещания, значения, возвращаемые асинхронных функций становятся разрешенное значение, ошибки скинуть становятся неприятие ценностей, и await делает код появляются ждите обещанного урегулировать, прежде чем продолжить. Это означает, что вы можете писать код гораздо ближе к одной выше.

Одна хорошая вещь о async/await по сравнению с обычными обещаниями лучше снимать. Вам не придется пройти вперед вещи из предыдущих then на следующий then.

const { promisify } = require('util')
const fs = require('fs')
const readdir = promisify(fs.readdir)
const readFile = promisify(fs.readFile)
const writeFile = promisify(fs.writeFile)
const stat = promisify(fs.stat)

async function op(){
const files = await readdir('.')
const file = files[0]
const data = await stat(file)

if (!(data.stat.mode | fs.S_IRWXO)) throw "Not Readable"

const content = await readFile(file)

await writeFile('Test', content)
}

// Needed, since Node will warn you about unhandled rejections.
// Otherwise, the code above could have been an async iife.
op().then(() => {
console.log("It worked")
}, (e) => {
console.log("Error: " + e)
})

3
ответ дан 23 марта 2018 в 09:03 Источник Поделиться