【问题标题】:Wait for event before continue processing在继续处理之前等待事件
【发布时间】:2016-05-14 04:45:25
【问题描述】:

目前我遇到如下问题。

我创建了一个处理重试的函数。

function retry(fn, maxTimes) {
  const attempt = async (time) => {
    try {
      const result = fn()
      return (result && result.then) ? await result : result
    }
    catch (err) {
      if (time === maxTimes) throw err
      return await attempt(++time)
    }
  }

  return attempt()
}

我还有另一种方法,比如

_handleData(data) {
  throw new Error('this is error')
}

const data = ''
const start = () => {
  this.item.on('data', ::this._handleData)
  this.item.write(data) // trigger event data
}
try {
  await retry(start, MAX_RETRY_TIMES)
}
catch (err) {
  console.log('error', err)
}

但函数start 不会重试。有什么办法可以解决这个问题吗?

【问题讨论】:

  • 分享更多代码,不清楚data事件是否被触发
  • @MedetTleukabiluly this.item.write(data) 这个命令触发上面的事件数据
  • 整个return (result && result.then) ? await result : result 应该只是return result
  • 您的start 函数不会返回承诺,并且不会在data 事件中被拒绝。你需要承诺this.item

标签: javascript ecmascript-6 es6-promise


【解决方案1】:

我是这样解决的

startApp() {
  const data = ''
  const start = () => {
    try {
      const sendData = await this._sendData(data)
      this._handleData(sendData)
    }
    catch (err) {
      throw err
    }
  }
  try {
    await retry(start, MAX_RETRY_TIMES)
  }
  catch (err) {
    console.log('error', err)
  }
}

_sendData(data) {
  return new Promise((resolve) => {
    this.item.on('data', resolve)
    this.item.write(data) // trigger event data
  })
}

_handleData(data) {
  throw new Error('this is error')
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多