0

关于生成器,我有 2 个问题要问,因为我只是在学习这个功能。

  1. 不确定,下面的实现有什么问题。我正在消耗输出
{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

代码 :

function *generator(){
 const res = yield fetch('https://jsonplaceholder.typicode.com/todos/1'); 
 const response = yield res.json();
}

let g = generator();
g.next();
//PRINTS
> {value: Promise, done: false} //why the value here is  Promise, I was expecting the json object

请帮助我理解,上面的代码有什么问题。

  1. 我的第二个问题是,我不了解或不了解生成器的用例,我的意思是,我们可以在实际项目中在哪里使用这种可暂停函数。
4

3 回答 3

0

您必须先等待获取解决,您可以使用 .then() 或使生成器异步并等待获取。虽然,这在今天不会有太大用处。在 async/await 甚至是 Promise 之前,人们使用的生成器就像你今天使用的 async/await 一样,带有类似 co wrap 的东西,它基于回调。

至于今天的使用,你可以在 .lib 等库中找到它们redux-saga,但它们大多被 async/await 和 promises 取代,它们更轻量级且更易于推理。

于 2020-04-11T18:05:38.907 回答
0

试试看:

async function* generator() {
    yield (await fetch('https://jsonplaceholder.typicode.com/todos/1'))
        .json()
}

(async () => console.log((await generator()).next()))()

于 2020-04-11T19:20:01.233 回答
0

生成器将返回您在 a 之后返回的任何内容yield。在您的情况下,您正在返回一个承诺,因为这是您在第一次收益后返回的内容。

另一个调用next应该返回你的结果。

例如,生成器的一个用例是生成一个无限列表。您无法存储它,但您可以一次生成一个元素,并且很可能在某个时间点停止。

通常,当您不想或不能生成完整的对象列表并且一次只生成一个元素时,生成器非常有用。

于 2020-04-11T18:03:25.453 回答