【发布时间】:2017-07-22 07:38:04
【问题描述】:
我正在尝试重写一个同步连接以使用 Promise,但我有点坚持。我有一个函数可以调用不同的例程 A、B 和 C,具体取决于参数和结果:
const worker = (v, r, ok, er)=>{
if(v > 10) {
ok(r)
} else {
er(r)
}
};
const A = v=>{let r = null; worker(v, 'a', _r=>r=_r, ()=>{});return r};
const B = v=>{let r = null; worker(v, 'b', _r=>r=_r, ()=>{});return r};
const C = v=>{let r = null; worker(v, 'c', _r=>r=_r, ()=>{});return r};
const mainSync = (obj)=>{
let result = null;
if(obj.a) {
result = A(obj.a);
}
if (!result && obj.b) {
result = B(obj.b);
}
if (!result && obj.c) {
result = C(obj.c);
}
return result;
}
https://repl.it/JcjE/0 与同步 A、B 和 C 工作正常:
mainSync({a:4}) === null;
mainSync({a:4, b:14}) === 'b';
mainSync({a:14, b:14}) === 'a';
mainSync({b:4, c:14}) === 'c';
// etc
现在 A、B 和 C 成为 Promise:
const worker = (v, r, ok, er)=>{
if(v > 10) {
ok(r)
} else {
er(r)
}
};
const A = v=>new Promise((ok, er)=>worker(v, 'a', ok, er));
const B = v=>new Promise((ok, er)=>worker(v, 'b', ok, er));
const C = v=>new Promise((ok, er)=>worker(v, 'c', ok, er));
我不太确定如何处理它:
const mainAsync = (obj)=>{
// what todo here?
}
我很高兴 mainAsync 返回 Promise 本身,比如
mainAsync({a:4}).then(r=>r === null);
mainAsync({a:4, b:14}).then(r=>r === 'b');
mainAsync({a:14, b:14}).then(r=>r === 'a');
mainAsync({b:4, c:14}).then(r=>r === 'c');
问题是对B 的调用取决于A 的结果,而对C 的调用取决于A 和B 的结果,目前还没有async/await 可用。
我尝试了我的幼稚方法https://repl.it/Jcjw/0,但它很糟糕,并且在现实生活中不太适用。
PS:如果可能的话,我正在寻找 vanilla javascript,并且知道类似的问题,例如
- Sequential call of promises,
- How to execute promises sequentially, passing the parameters from an array?,
等等,但不知道如何将它们应用到我的案例中。
【问题讨论】:
-
你为什么要尝试使用 Promise 进行同步操作?这只是一种学习努力吗?因为没有实际理由将 Promise 与纯同步操作一起使用 - 这只会使代码变得比需要的复杂。
-
不,这是一个很实际的问题。函数 A B C 已更改,现在我必须调整我的代码才能使用它们。
-
我还是不明白。如果所有代码都是同步的,就没有理由使用 Promise。就像所有正常的同步代码一样,只需从函数中返回一个值。
-
对不起,如果我不清楚,但功能 A、B 和 C 超出了我的控制范围。在新版本中,它们变成了承诺。
-
是的,一点都不清楚。请编辑您的问题以明确说明。此外,您不会“调用承诺”,以免措辞混乱。您调用返回承诺的函数。 Promise 是一个对象,它代表一些未来的异步结果(或错误)——它不是一个函数。
标签: javascript node.js ecmascript-6