这是一个非常简单的问题。
如何在graphql中实现订阅?
我是在特别要求使用下面的graphql.js
构造函数时?
我找不到干净/简单的实施方式。
还有另一个question here,但它处理的是relay.js
-我不想不必要地增加应用程序中外部依赖关系的数量。
我所拥有的:
module.exports = function (database){
return new GraphQLSchema(
{ query: RootQuery(database)
, mutation: RootMutation(database)
, subscription: RootSubscription(database) -- i can see this in graphiql - see below
}
);
}
function RootSubscription(database){
return new GraphQLObjectType(
{ name: "RootSubscriptionType"
, fields:
{ getCounterEvery2Seconds:
{ type: new GraphQLNonNull(GraphQLInt)
, args :
{ id: { type: GraphQLString }
}
, subscribe(parent, args, context){
// this subscribe function is never called .. why?
const iterator = simpleIterator()
return iterator
}
}
}
}
)
}
我了解到我需要一个subscribe()
,它必须从this github issue返回一个迭代器。
这是一个简单的异步迭代器。此迭代器所做的全部-是每2秒增加并返回一次计数器。当达到10时停止。
function simpleIterator(){
return {
[ Symbol.asyncIterator ]: () => {
let i = 0
return {
next: async function(){
i++
await delay(2000)
if(i > 10){
return { done: true }
}
return {
value: i,
done: false
}
}
}
}
}
}
当我运行graphiql订阅时,由于某种原因它返回null:
我正在将来自多个来源的代码拼凑在一起-浪费时间并基本上对其进行黑客攻击。你能帮我解决这个问题吗? 订阅是如此重要,请在哪里正确记录?您刚刚复制粘贴的那段代码在哪里(例如查询,例如look here)。
此外,我不能使用架构分开的示例-作为字符串/来自文件。我已经将我的架构创建为 javascript构造函数。现在,由于我尝试添加订阅,因此我不能只回到使用模式作为字符串。需要重写整个项目。或者我可以同时拥有两者吗?谢谢:)