传递参数时,.then()在setInterval函数中不起作用?

时间:2017-08-04 10:16:41

标签: javascript setinterval

以下是我的代码,我收到此错误Unhandled Rejection (TypeError): startPolling.bind(...).then is not a function

 setInterval(startPolling.bind(null, id).then(function(response){
       if (response.id == 0){
         console.log("stop polling")
       }
     }), 2000)


 function startPolling(id){
  return callApi('/someUrl/'+id+'','get') // it returns a promise
 }

问题:  如果我在调用bind时未使用startPolling,则setInterval不会每2秒执行一次代码。

如果我在调用bind时使用startPolling,则setInterval正在执行它的方式,但then()未执行,因为我收到了上述错误

2 个答案:

答案 0 :(得分:1)

startPolling.bind返回一个新函数,当调用它时会调用startPolling,而startPolling.bind(null, id)().then将返回一个promise。如果有什么需要bind ......这显然是无稽之谈。

你不能setInterval(function () { startPolling(id).then(...) }, 2000); 在这里。您以后无法调用函数,但会立即访问其返回值的属性。使用回调包装器:

clickContent

答案 1 :(得分:0)

为了能够更彻底地回答您的问题,我需要更多调试,例如您startPolling上的console.log。测试场景:如果删除.bind,startPolling仍然会触发,但可能会出错(您当前没有捕获)因此没有启动间隔?

我计划在某个时间间隔内轮询异步函数的方法如下:

public startIntervalPolling(id, intervalDuration=2000) {
    var intervalVariable = setInterval(
        startPolling(id).then((response) => {
          console.log("Polling response", response);
          if (response.id == 0) {
            clearInterval(intervalVariable);
          }
        }, (pollingError) => {
          console.error("Error while polling", pollingError)
        }), intervalDuration);
  }

尚未测试过,但希望这可以帮助您朝着正确的方向前进。