如何使用生成器函数作为fetch调用返回的promise内的回调?

时间:2016-08-04 06:54:56

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



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




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

3 个答案:

答案 0 :(得分:2)

  

上述情况可能吗?

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

  

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

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

在任何情况下,您的代码应如下所示:

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

答案 1 :(得分:2)

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

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 :(得分:0)

在这里拍摄远景。为了迭代生成器函数,您需要能够调用&gen; 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中使用。