XState:在没有中间状态的情况下链接多个承诺
XState: chaining multiple promises without intermediary states
我读过 Invoking Multiple Services 部分,其中说可以调用多个 promise,但在我自己的测试中,它们似乎在不等待前一个完成的情况下被调用
// ...
invoke: [
{ id: 'service1', src: 'someService' },
{ id: 'service2', src: 'someService' },
{ id: 'logService', src: 'logService' }
],
// ...
也是创建中间状态的解决方法的答案
states: {
first: {
invoke: {
src: 'one',
onDone: {
target: 'second',
}
}
},
second: {
invoke: {
src: 'two',
onDone: {
target: 'success',
}
}
},
success: {
type: 'final'
}
}
有没有一种方法可以像 Promise.each
那样通过调用进行链接,使 invoke([]) 运行 串行化?
我只能看到两个选项:
- 中间状态
- 调用一个本身进行链接的承诺。
所有状态行为都需要在状态机中显式显示。如果你想按顺序 运行 承诺,那就是有状态的——你在下一个承诺开始之前检查每个承诺的状态。因此,你需要多个状态,就像你发布的解决方案一样。
但是,您可以创建一个辅助函数来执行您想要的操作:
async function sequence(...promiseCreators) {
for (const promiseCreator of promiseCreators) {
await promiseCreator();
}
return;
}
// ...
invoke: {
src: () => sequence(createPromise1, createPromise2, createAsyncLogger)
}
// ...
但这提出了进一步的问题:
- 如果出现错误怎么办? (添加
try/catch
)
- 那interruption/cancellation呢?你是怎么处理的?
- 您如何汇总从承诺中解决的数据?
- 你如何处理依赖解析;即,承诺 A 取决于来自承诺 B 的数据?
您的用例可以很容易地回答这些问题,但有许多可能的用例需要考虑。这就是为什么最好明确说明承诺的顺序(使用中间状态)而不是让库 (XState) 对您的用例做出假设。
我读过 Invoking Multiple Services 部分,其中说可以调用多个 promise,但在我自己的测试中,它们似乎在不等待前一个完成的情况下被调用
// ...
invoke: [
{ id: 'service1', src: 'someService' },
{ id: 'service2', src: 'someService' },
{ id: 'logService', src: 'logService' }
],
// ...
states: {
first: {
invoke: {
src: 'one',
onDone: {
target: 'second',
}
}
},
second: {
invoke: {
src: 'two',
onDone: {
target: 'success',
}
}
},
success: {
type: 'final'
}
}
有没有一种方法可以像 Promise.each
那样通过调用进行链接,使 invoke([]) 运行 串行化?
我只能看到两个选项:
- 中间状态
- 调用一个本身进行链接的承诺。
所有状态行为都需要在状态机中显式显示。如果你想按顺序 运行 承诺,那就是有状态的——你在下一个承诺开始之前检查每个承诺的状态。因此,你需要多个状态,就像你发布的解决方案一样。
但是,您可以创建一个辅助函数来执行您想要的操作:
async function sequence(...promiseCreators) {
for (const promiseCreator of promiseCreators) {
await promiseCreator();
}
return;
}
// ...
invoke: {
src: () => sequence(createPromise1, createPromise2, createAsyncLogger)
}
// ...
但这提出了进一步的问题:
- 如果出现错误怎么办? (添加
try/catch
) - 那interruption/cancellation呢?你是怎么处理的?
- 您如何汇总从承诺中解决的数据?
- 你如何处理依赖解析;即,承诺 A 取决于来自承诺 B 的数据?
您的用例可以很容易地回答这些问题,但有许多可能的用例需要考虑。这就是为什么最好明确说明承诺的顺序(使用中间状态)而不是让库 (XState) 对您的用例做出假设。