const fs = require('fs');
let readPromise = (path) => {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf-8', (error, data) => {
if (error) return reject(new Error(error));
return resolve(data);
});
});
};
readPromise('./song1.txt').then(
(data) => console.log(data),
(err) => console.log(err)
);
readPromise('./song2.txt').then(
(data) => console.log(data),
(err) => console.log(err)
);
readPromise('./song3.txt').then(
(data) => console.log(data),
(err) => console.log(err)
);
const fs = require('fs');
let readPromise = (path) => {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf-8', (error, data) => {
if (error) return reject(new Error(error));
return resolve(data);
});
});
};
readPromise('./song1.txt')
.then((data1) => {
console.log(data1);
return readPromise('./song2.txt');
})
.then((data2) => {
console.log(data2);
return readPromise('./song3.txt');
})
.then((data3) => {
console.log(data3);
return readPromise('./song3.txt');
})
.catch((err) => console.log(err));
const fs = require('fs');
let readPromise = (path) => {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf-8', (error, data) => {
if (error) return reject(err);
return resolve(data);
});
});
};
Promise.all([
readPromise('./song1.txt'),
readPromise('./song2.txt'),
readPromise('./song3.txt'),
])
.then((arr) => readEach(arr)) // .then((arr) => console.log(arr))
.catch((err) => console.log(err + ''));
let readEach = (arr) => {
arr.forEach((item) => {
console.log(item);
});
};
Có thể xử lý như sau:
npm install co
B2: Cấu trúc của Node co Module
như sau:
const co = require('co');
var fn = co(function *(){(val) {
return yield Promise.resolve(val);
});
// prettier-ignore
fn(true).then(function (val) {
});
co(function*())
: Phải có dấu * ở đây được gọi là Generator Function
.yield
: Từ khóa yield
có khả năng gọi Promise
.const fs = require('fs');
const co = require('co');
let readPromise = (path) => {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf-8', (error, data) => {
if (error) return reject(error);
return resolve(data);
});
});
};
co(function* () {
return yield readPromise('./song1.txt');
})
.then((data) => console.log(data))
.catch((err) => console.log(err + ''));
Co
như sau:co(function* () {
var song1 = yield readPromise('./song1.txt');
var song2 = yield readPromise('./song2.txt');
var song3 = yield readPromise('./song3.txt');
console.log(song1, song2, song3);
});
var arr = co(function* () {
var song1 = yield readPromise('./song2.txt');
var song2 = yield readPromise('./song1.txt');
var song3 = yield readPromise('./song3.txt');
return [song1, song2, song3];
})
.then((data) => data)
.catch((err) => console.log(err + ''));
setTimeout(() => {
console.log(arr);
}, 2000);
co.wrap
.// Không truyền tham số vào đây được.
var str = 'Hello!';
co(function* (str) {
console.log(str); // undefined : Không hiểu
var files = ['./song1.txt'];
var values = yield files.map((item) => {
return readPromise(item);
});
return values;
})
.then((data) => console.log(data))
.catch((err) => console.log(err + ''));
yield
là 1 mảng như sau:co(function* () {
var values = yield [
readPromise('./song2.txt'),
readPromise('./song1.txt'),
readPromise('./song3.txt'),
];
return values;
})
.then((data) => console.log(data))
.catch((err) => console.log(err + ''));
var arr = co(function* () {
var values = yield [
readPromise('./song2.txt'),
readPromise('./song1.txt'),
readPromise('./song3.txt'),
];
return values;
})
.then((data) => data)
.catch((err) => err + '');
setTimeout(() => {
console.log(arr);
}, 1000);
Node co
như một hàm và có khả năng truyền tham số vào để dùng như sau:readFiles(['./song1.txt', './song2.txt', './song3.txt'])
.then((data) => console.log(data))
.catch((err) => console.log(err));
var files = ['./song1.txt', './song2.txt', './song3.txt'];
let readFiles =
//[strings] => yield Promise
co.wrap(function* (arrFiles) {
var values = yield arrFiles.map((file) => {
return readPromise(file);
});
return values;
});
readFiles(files)
.then((data) => console.log(data[0]))
.catch((err) => console.log(err));
function readFiles(path) {
var values = co.wrap(function* (path) {
return yield path.map((value) => {
return readPromise(value);
});
});
console.log(values);
}
readFiles(['./song1.txt', './song2.txt', './song3.txt']).then((data) =>
console.log(data)
);
// TypeError: Cannot read property 'then' of undefined
function readFiles(path) {
co.wrap(function* (path) {
var data = yield path.map((value) => {
return readPromise(value);
});
return data;
});
}
readFiles(['./song1.txt', './song2.txt', './song3.txt']).then((data) =>
console.log(data)
);
Node co có thể sử dụng theo 2 cách:
C1: Sử dụng như đối tượng Promise trả về.
co(fn*).then( val => )
C2: Sử dụng như hàm function có thể truyền tham số vào để xử lý để trả về.
var fn = co.wrap(fn*)
a generator
có thể xử lý Callback Promiseco(function* () {
return yield Promise.resolve(true);
}).then(
function (val) {
console.log(val);
},
function (err) {
console.error(err.stack);
}
);
const fs = require('fs');
const co = require('co');
let readPromise = (path) => {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf-8', (error, data) => {
if (error) return reject(error);
return resolve(data);
});
});
};
co(function* () {
var values = yield [
readPromise('./song2.txt'),
readPromise('./song1.txt'),
readPromise('./song3.txt'),
];
return values;
})
.then((data) => console.log(data))
.catch((err) => console.log(err + ''));
Promise
var fn = co.wrap(function* (val) {
return yield Promise.resolve(val);
});
fn(true).then(function (val) {});
const fs = require('fs');
const co = require('co');
let readPromise = (path) => {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf-8', (error, data) => {
if (error) return reject(error);
return resolve(data);
});
});
};
var files = ['./song1.txt', './song2.txt', './song3.txt'];
let readFiles = co.wrap(function* (arrFiles) {
var values = yield arrFiles.map((file) => {
return readPromise(file);
});
return values;
});
readFiles(files)
.then((data) => console.log(data[0]))
.catch((err) => console.log(err));
/**
* Sử dụng node co + axios để tải về các đường link sau theo 2 cách:
*/
var urls = [
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/todos/299',
'https://jsonplaceholder.typicode.com/todos/3',
'https://jsonplaceholder.typicode.com/todos/4',
'https://jsonplaceholder.typicode.com/todos/5',
];
/**
* Sử dụng node co + axios để tải về các đường url sau theo 2 cách:
*/
const axios = require('axios');
const co = require('co');
var urls = [
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/todos/2',
'https://jsonplaceholder.typicode.com/todos/3',
'https://jsonplaceholder.typicode.com/todos/4',
'https://jsonplaceholder.typicode.com/todos/5',
];
// axiosPromise
let axiosPromise = (path) => {
return new Promise((resolve, reject) => {
axios
.get(path)
.then((response) => resolve(response.data))
.catch((error) => reject('Lỗi url: ' + error.config.url));
});
};
//! Cách 1:
co(function* () {
var value = yield urls.map((url) => {
return axiosPromise(url);
});
return value;
})
.then((data) => console.log('Cách 1: ', data))
.catch((err) => console.log(err + ''));
//! Cách 2:
let axiosCO = co.wrap(function* (urls) {
var result = yield urls.map((url) => {
return axiosPromise(url);
});
return result;
});
axiosCO(urls)
.then((data) => console.log('Cách 2: ', data))
.catch((err) => console.log(err));
axios
như vậy:/**
* Sử dụng node co + axios để tải về các đường url sau theo 2 cách:
*/
var urls = [
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/todos/222',
'https://jsonplaceholder.typicode.com/todos/3',
'https://jsonplaceholder.typicode.com/todos/4',
'https://jsonplaceholder.typicode.com/todos/5',
];
// Cách dùng axios
const axios = require('axios');
/*
axios
.get('https://jsonplaceholder.typicode.com/todos/1')
.then((response) => console.log(response))
.catch((error) => console.log(error))
.then(() => console.log('Thực hiện xong'));
*/
const co = require('co');
//! Cách 1:
co(function* () {
var value = yield urls.map((url) => {
return axios
.get(url)
.then((response) => response.data)
.catch((error) => 'Error: ' + error.config.url);
});
return value;
})
.then((data) => console.log('Cách 1: ', data))
.catch((err) => console.log(err + ''));
//! Cách 2:
function requestAxiosPromise(path) {
return new Promise(function (resolve, reject) {
axios
.get(path)
.then(function (response) {
resolve(response.data);
})
.catch(function (error) {
reject(error.config.url);
});
});
}
co(function* () {
return yield urls.map((link) => {
return requestAxiosPromise(link);
});
})
.then((link) => console.log('Load: ', link))
.catch((err) => console.log('Error: ', err));
//! Cách 3:
let axiosCO = co.wrap(function* (urls) {
var result = yield urls.map((url) => {
return axios
.get(url)
.then((response) => response.data)
.catch((error) => 'Error: ' + error.config.url);
return value;
});
return result;
});
axiosCO(urls)
.then((data) => console.log('Cách 2: ', data))
.catch((err) => console.log(err));