【问题标题】:How to use a generator function as a callback inside a promise returned by fetch call?如何在 fetch 调用返回的 Promise 中使用生成器函数作为回调?
【发布时间】:2016-08-04 06:54:55
【问题描述】:

return fetch(url, {
    credentials: 'same-origin',
    ...options
  })
  .then(response => response.json())
  .then(function*(response) {
    console.log("httpStatusCode", response.httpStatusCode)
  })

以上可能吗? 当回调函数是生成器时,我没有得到控制台输出,这意味着控件没有传递给回调函数(生成器)。 我想这样做的真正原因是我必须从上述回调中使用 redux-saga 的 'call' 辅助函数调用另一个 fetch 请求,该回调只能从生成器函数中调用。

【问题讨论】:

  • .then 中的生成器对我来说似乎很奇怪,您只需在 promise 解决后调用一次 .then 函数。
  • then 处理程序中的生成器对象将简单地返回生成器对象。你应该做的是,返回一个包含 fetch 调用的 Promise 对象。
  • 你想要完成什么?

标签: javascript ecmascript-6 es6-promise redux-saga


【解决方案1】:

我想你可以做到。当生成器函数运行时,它将生成一个生成器对象,并将传递到下一个阶段,您可以在该阶段启动生成器。让我们看看...

var pr = Promise.resolve(42);
pr.then(function*(n){ yield n; yield n / 2; yield 37})
  .then(it => {console.log(it.next().value);
               console.log(it.next().value);
               console.log(it.next().value);
              });

【讨论】:

    【解决方案2】:

    以上可以吗?

    没有。 then 方法将简单地调用生成器函数并创建一个生成器,然后 丢弃它 履行链式承诺,而不推进它。每当您想使用生成器时,您实际上都需要运行它们的东西。

    我想这样做的真正原因是我必须使用 redux-saga 的“call”辅助函数从上述回调中调用另一个 fetch 请求,该回调只能从生成器函数中调用。

    不。您不必从任意生成器函数调用call。您可以从 redux-saga 使用的生成器函数调用 yieldcall()

    无论如何,您的代码应如下所示:

    let response = yield take(fetch(url, {
        credentials: 'same-origin',
        ...options
    }));
    response = yield take(response.json());
    console.log("httpStatusCode", response.httpStatusCode)
    

    【讨论】:

      【解决方案3】:

      在这里拍个长镜头。为了遍历生成器函数,您需要能够调用“gen.next()”。在向 '.then' 提供匿名函数后,这是不可能的。

      我不熟悉 redux-saga,但据我了解,您尝试类似的东西。

      function response (data) {
         console.log("httpStatusCode", data.httpStatusCode);
      }
      
      
      fetch(url, {...})
         .then(function (d) {
            var gen = response(d);
         })
      

      然后您可以传递 gen 以在 redux-saga 中使用。

      【讨论】:

      • 不要在 Promise 回调之外声明变量。
      猜你喜欢
      • 2017-09-05
      • 1970-01-01
      • 2015-05-12
      • 2021-10-09
      • 1970-01-01
      • 2019-08-19
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多