/
value-promise.ts
104 lines (90 loc) · 2.38 KB
/
value-promise.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// Copyright IBM Corp. 2019. All Rights Reserved.
// Node module: @loopback/example-context
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT
import {
Context,
ContextView,
filterByTag,
isPromiseLike,
resolveList,
resolveMap,
transformValueOrPromise,
ValueOrPromise,
} from '@loopback/context';
/**
* A greeter
*/
interface Greeter {
language: string;
/**
* Greet in the given language
* @param name - Name
* @returns A message or a promise of a message
*/
greet(name: string): ValueOrPromise<string>;
}
class ChineseGreeter implements Greeter {
language = 'zh';
greet(name: string) {
return `[value] 你好,${name}!`;
}
}
class EnglishGreeter implements Greeter {
language = 'en';
greet(name: string) {
return `[value] Hello, ${name}!`;
}
}
class AsyncChineseGreeter implements Greeter {
language = 'zh';
greet(name: string) {
return new Promise<string>(resolve =>
setImmediate(() => {
resolve(`[promise] 你好,${name}!`);
}),
);
}
}
export async function main() {
const ctx = new Context('app');
// Add EnglishGreeter for now
ctx
.bind('greeters.EnglishGreeter')
.toClass(EnglishGreeter)
.tag('greeter');
// Add ChineseGreeter
ctx
.bind('greeters.ChineseGreeter')
.toClass(ChineseGreeter)
.tag('greeter');
const greetersView = ctx.createView<Greeter>(filterByTag('greeter'));
await greetFromAll(greetersView);
// Replace ChineseGreeter with AsyncChineseGreeter
ctx
.bind('greeters.ChineseGreeter')
.toClass(AsyncChineseGreeter)
.tag('greeter');
await greetFromAll(greetersView);
}
async function greetFromAll(greetersView: ContextView<Greeter>) {
const greeters = await greetersView.values();
const greetings = resolveList(greeters, greeter => {
return greeter.greet('John');
});
if (isPromiseLike(greetings)) {
console.log('async:', await greetings);
} else {
console.log('sync:', greetings);
}
const greeterMap: {
[language: string]: Greeter;
} = {};
greeters.filter(greeter => (greeterMap[greeter.language] = greeter));
const greetingsByLanguage = resolveMap(greeterMap, greeter =>
greeter.greet('Jane'),
);
await transformValueOrPromise(greetingsByLanguage, console.log);
}
// tslint:disable-next-line:no-floating-promises
if (require.main === module) main();