Tôi là người mới sử dụng Rx và thấy khó tìm tài liệu về các lời hứa soạn thảo để dữ liệu từ lời hứa đầu tiên được chuyển sang lần thứ hai và cứ tiếp tục như vậy. Dưới đây là ba lời hứa rất cơ bản, các tính toán trên dữ liệu không quan trọng, chỉ cần một cái gì đó không đồng bộ phải được thực hiện bằng cách sử dụng dữ liệu từ lời hứa trước đó.RxJS Promise Composition (truyền dữ liệu)
const p1 =() => Promise.resolve(1);
const p2 = x => { const val = x + 1; return Promise.resolve(val); };
const p3 = x => {
const isEven = x => x % 2 === 0;
return Promise.resolve(isEven(x));
};
Cách truyền thống để đạt được các thành phần Tôi đang nói về:
pl().then(p2).then(p3).then(console.log);
thực ưa thích của tôi là Ramda của composeP và pipeP:
R.pipeP(p1, p2, p3, console.log)()
Dường như Rx có thể có thể để xử lý tình huống này khá trôi chảy. Tuy nhiên, gần nhất tôi đã tìm thấy cho đến nay là từ RxJS để async (thư viện) so sánh ở đây https://github.com/Reactive-Extensions/RxJS/blob/master/doc/mapping/async/comparing.md:
var Rx = require('rx'),
fs = require('fs'),
path = require('path');
var file = path.join(__dirname, 'file.txt'),
dest = path.join(__dirname, 'file1.txt'),
exists = Rx.Observable.fromCallback(fs.exists),
rename = Rx.Observable.fromNodeCallback(fs.rename),
stat = Rx.Observable.fromNodeCallback(fs.stat);
exists(file)
.concatMap(function (flag) {
return flag ?
rename(file, dest) :
Rx.Observable.throw(new Error('File does not exist.'));
})
.concatMap(function() {
return stat(dest);
})
.forEach(
function (fsStat) {
console.log(JSON.stringify(fsStat));
},
function (err) {
console.log(err);
}
);
concatMap dường như hứa hẹn, nhưng mã trên có vẻ khá khủng khiếp. Tôi cũng gặp rắc rối với ví dụ của tôi vì Rx.Observable.fromPromise (p1) sẽ không hoạt động vì nó mong đợi một lời hứa, không phải là một hàm, và Rx.Observable.defer (p1) dường như không truyền các tham số như thí dụ.
Cảm ơn!
câu hỏi tương tự nhưng không có dữ liệu qua: Chaining promises with RxJS
lời hứa của bạn có được bao bọc trong một chức năng không? – user3743222
Chỉ trong đó nếu bạn đã xác định lời hứa bên ngoài chuỗi Promise hoặc có thể quan sát được như const p1 = new Promise ((giải quyết, từ chối) => {}), nó sẽ bắt đầu đánh giá ngay lập tức và không thể nhận dữ liệu từ trước thực hiện lời hứa. Hay tôi sai về đánh giá ngay lập tức? –