title |
---|
Promises |
Ólafur Sverrir Kjartansson, [email protected]
- Node.js hefur stuðning við promises sem gerir það auðveldara að vinna með async kóða
- Frá og með útgáfu 8 getum við notað
util.promisify
til að breyta callback API í promise API - Frá og með útgáfu 14 getum við notað
fs/promises
fyrir promise API ofan áfs
const util = require('util');
const fs = require('fs');
const readFileAsync = util
.promisify(fs.readFile);
readFileAsync('data.txt')
.then((data) => {
console.log(data.toString('utf8'));
})
.catch((err) => {
console.error(err);
});
- Getum notað
async
ogawait
sem getur flatt kóðann okkar - Verðum að hafa
async
fall utan um kóða, t.d. meðmain
falli- Þangað til í nodejs 14.8 þegar stuðning við top level await var bætt við ef við notum ES modules
- Það fall verður að promise, þurfum að setja
catch
á það til að grípa allar villur
- Verðum að passa að nota
async
ogawait
á réttum stöðum og meðtry catch
Promise
eru truthy, getur komið okkur í vandræði!
const util = require('util');
const fs = require('fs');
const rfAsync = util.promisify(fs.readFile);
async function main() {
let data = '';
try {
data = await rfAsync('data.txt');
} catch (e) {
console.error('error', e);
}
console.log(data.toString('utf8'));
}
main()
.catch((err) => { console.error(err); });
const fs = require('fs/promises');
async function main() {
let data = '';
try {
data = await fs.readFile('data.txt');
} catch (e) {
console.error('error', e);
}
console.log(data.toString('utf8'));
}
main()
.catch((err) => { console.error(err); });
- Ef við skrifum forrit sem nota promises og
async await
er líklegt að villa verði ekki meðhöndluð á einhverjum tímapunkti - Fáum
UnhandledPromiseRejectionWarning
frá Node.js- Í framtíðinni mun það stöðva keyrslu á forriti
- Node.js skilar frá sér
unhandledRejection
atburð þegar þetta á sér stað - Getum gripið með
process.on('unhandledRejection', (reason, p) => { /* ... */ })
- Ættum aðeins að nota til að logga og debugga, forritið okkar verður komið í óskilgreinda stöðu