📅  最后修改于: 2023-12-03 15:12:05.508000             🧑  作者: Mango
在编写订阅功能时,我们必须保证订阅字段返回的是一个异步可迭代对象(Async Iterable),否则可能会导致程序出错。这个错误提示告诉我们返回值为未定义(undefined),也就是说在代码中没有显式地指定订阅字段的返回值。
什么是异步可迭代对象呢?简单来说,它就是一种能够被异步迭代的对象,并且可以与for-await-of
语句一起使用。一般情况下,我们可以使用async function*
语句来定义异步可迭代对象。
下面是一个示例代码片段,演示如何定义一个异步可迭代对象:
async function* generateNumbers(start, end) {
for (let i = start; i <= end; i++) {
await new Promise(resolve => setTimeout(resolve, 1000));
yield i;
}
}
const asyncIterable = generateNumbers(1, 5);
(async () => {
for await (const num of asyncIterable) {
console.log(num);
}
})();
可以看到,我们使用async function*
定义了一个异步可迭代对象generateNumbers
,然后使用for-await-of
循环迭代这个对象,并在每次迭代中使用await
等待1秒钟。
如果出现了订阅字段必须返回 Async Iterable. 收到:未定义. 的错误提示,我们需要检查订阅字段是否正确定义了返回值,并且返回值是否为异步可迭代对象。在订阅字段中使用async function*
语句定义异步可迭代对象即可。
const SubscriptionType = new GraphQLObjectType({
name: 'Subscription',
fields: {
messageAdded: {
type: MessageType,
subscribe: async function* (args, context) {
// 定义异步可迭代对象
const asyncIterable = ...;
// 返回异步可迭代对象
yield* asyncIterable;
}
}
}
});
最后,我们来总结一下:
async function*
语句定义异步可迭代对象;