在setInterval()中调用生成器函数

时间:2019-01-14 16:48:06

标签: node.js redux react-redux generator saga

我试图在setInterval()方法内调用生成器函数。此代码的目的是它将定期查询特定服务器的某些数据,直到获得非零响应为止。收到响应后,它将调用storeAddress(),这是在同一文件中定义的生成器函数。 下面的代码给我这样的错误:

  

SyntaxError:yield是保留字(248:6)

注意:我正在使用react-boilerplate构建我的应用。据我通过搜索互联网得知,上述错误是由通天塔抛出的。

  • 我尝试了const query = yeild call (setInterval, function(){magic code}, 10000)。这不会产生错误,但是magic code永远不会执行。

  • 我尝试了const query = setInterval(function* () {magic code}, 10000),其效果与上述相同。

  • 我尝试了const query = setInterval(yield call(function(){magic code}, 10000),效果与上述相同。

  • 我尝试了const query = yield call (setInterval, function(){magic code}, 10000),其效果与上述相同。

  • 我在storeAddress(action.payload, balance).next()内尝试过setInterval()。控件确实在storeAddress()内部流动,但是该函数内部也具有生成器调用,而该生成器调用不会被调用。实际上,在这种情况下,storeAddress()内部的第一个生成器调用之后什么也不会执行。

    function* callSaveNewAddress(action){
      const selectedNetwork = yield select(selectNetworkId());
      let count = 1;
      let balance = 0;
      const query = setInterval(function () {
        getAddressBalance(action.payload, selectedNetwork).then(res => 
        {return balance = res.data.mempool_balance});
    
        if(balance > 0) {
           yield call (storeAddress, action.payload, balance);
           clearInterval(query);
        } else if(count == 90) {
           clearInterval(query);
           console.log("Nothing received in 15 minutes");
        }
      }, 10000);
    }
    

那么我该如何在像storeAddress()这样的普通函数中调用setInterval()这个生成器函数呢?

1 个答案:

答案 0 :(得分:0)

const query= function * () {
  const runner = yield call(setInterval, () => {
    getAddressBalance(action.payload, selectedNetwork).then(res => 
    {return balance = res.data.mempool_balance});

    if(balance > 0) {
       yield call (storeAddress, action.payload, balance);
       clearInterval(query);
    } else if(count == 90) {
       clearInterval(query);
       console.log("Nothing received in 15 minutes");
    }
  }, 1000);
}

尝试在调用中使用setInterval,并通过参数传递要在其中执行的函数。