我是Rx的新手,我发现很难找到有关组成承诺的文档,以便第一个承诺的数据传递到第二个承诺,依此类推.这是三个非常基本的承诺,对数据的计算并不重要,只是必须使用先前承诺的数据来完成异步.
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));
};
Run Code Online (Sandbox Code Playgroud)
实现我正在谈论的构图的传统方式:
pl().then(p2).then(p3).then(console.log);
Run Code Online (Sandbox Code Playgroud)
我最喜欢的实现是Ramda的composeP和pipeP:
R.pipeP(p1, p2, p3, console.log)()
Run Code Online (Sandbox Code Playgroud)
似乎Rx可能能够非常流利地处理这种情况.但是,到目前为止我发现的最接近的是从RxJS到async(库)比较,这里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) …Run Code Online (Sandbox Code Playgroud) bar是一个简单的类装饰器,它将属性添加到类Foo中.
function bar(target) {
target.inDecorator = 'in decorator';
}
@bar
class Foo {
inClass:string;
inDecorator:string;
constructor() {
this.inClass = 'a string';
}
getInClass() {
return this.inClass;
}
}
console.log(Foo.inDecorator);
console.log(Foo.prototype.inDecorator);
const foo = new Foo();
console.log(foo.getInClass());
console.log(foo.inDecorator);
Run Code Online (Sandbox Code Playgroud)
导致错误的唯一控制台日志是第一个,Foo.inDecorator,包含在ts 1.5.3中的内容
Property 'inDecorator' does not exist on type 'typeof Foo'.
Run Code Online (Sandbox Code Playgroud)
据我所知,inDerator应该在Class Foo的原型上定义,并且应该在Foo上可用,就像它是静态道具一样.运行生成的js文件显示原型访问以及新foo对象的未定义,但是Foo.inDecorator即使它是错误的来源也能正确打印.更清楚的是,我们得到了
in decorator
undefined
a string
undefined
Run Code Online (Sandbox Code Playgroud)
关于如何正确输入/添加静态道具或方法的任何想法?
谢谢!
编辑这个,因为我最初忽略了原型访问,Foo.prototype.inDecorator无法正常工作的事实.