📌  相关文章
📜  订阅字段必须返回 Async Iterable.收到:未定义. (1)

📅  最后修改于: 2023-12-03 15:12:05.508000             🧑  作者: Mango

订阅字段必须返回 Async Iterable. 收到:未定义.

概述

在编写订阅功能时,我们必须保证订阅字段返回的是一个异步可迭代对象(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 Iterable;
  • 返回值必须为异步可迭代对象;
  • 可以使用async function*语句定义异步可迭代对象;
  • 在订阅字段中返回异步可迭代对象即可。