问题是关于突变,乐观响应和watchQuery的交互.
我有一个突变"myMutation",它有一个"optimisticResponse"和一个实现的"更新"功能.
每次我进行变异查询时,"update"函数被调用两次,第一次使用乐观响应数据,第二次使用实际数据.一切都很好,所有这些都在文档中描述.
在我的"更新"功能中,我通过使用readQuery/writeQuery方法修改"myQuery"缓存数据.
每次我修改"myQuery"缓存数据时,都会调用watchQuery(基于"myQuery")订阅.一切都很好,所有这些都在文档中描述.
但问题是我无法区分我的watchQuery是否收到乐观的响应数据或真实的响应数据.这对我来说至关重要,因为反应必须不同,因为有价值的数据部分只能由服务器提供.当我收到乐观的响应时,我应该显示一个具有特殊风格的GUI元素,我应该禁止与它进行任何交互,直到我收到真实的响应.
不幸的是,我无法解决这个问题.乍看之下,乐观和真实反应之间没有区别.我已经google了很多,并没有找到解决方案.我唯一的想法是在我的GraphQL数据中添加一个特殊字段,该字段将显示是否从服务器收到响应.但它看起来很难看,闻起来很糟糕.我相信,必须有一个简单的正确方法来克服这个问题.
我有一个关于测试的问题.我使用Angular 6,业力和茉莉.
我的测试是:
it(`my test`, async(() => {
console.log('### start test');
fixture.detectChanges();
// call a method which has async code
fixture.componentInstance.fakeTimeout();
console.log('isStable', fixture.isStable());
fixture.whenStable().then(() => {
// here I must check smth only when all async operations are completed
console.log('### end test');
});
}));
Run Code Online (Sandbox Code Playgroud)
我试图以fakeTimeout不同的方式实现该方法,即:
public fakeTimeout() {
new Promise((resolve, reject) => {
setTimeout(() => {
console.log('>>>>>> COMPONENT TIMEOUT!!!');
resolve(true);
}, 2000);
}).then(() => {});
}
Run Code Online (Sandbox Code Playgroud)
要么
public fakeTimeout() {
setTimeout(() => {
console.log('>>>>>> COMPONENT TIMEOUT!!!');
}, 2000); …Run Code Online (Sandbox Code Playgroud)