2

This function tries to load an image, if the image doesn't loads, the function is called again:

function loadImage (url = '', callback = () => {}) {
  utils.loadImage(url, () => {
    callback()
  }, () => {
    loadImage(url, callback)
  })
}

I want it to return I promise so I wrote:

function loadImage (url = '', callback = () => {}) {
  return new Promise((resolve, reject) => {
    utils.loadImage(url, () => {
      // what to do with resolve and reject
      callback()
    }, () => {
      loadImage(url, callback)
    })
  })
}

But I'm not sure where to place resolve and reject ...

alex
  • 7,111
  • 15
  • 50
  • 77
  • Looks fine... have you tried? Those parameters are not needed if you're not going to process them – FieryCat Jun 15 '17 at 09:23
  • Drop the `callback` parameter, and call `resolve` instead. – Bergi Jun 15 '17 at 09:49
  • You really should already promisify `utils.loadImage` if that's under your control – Bergi Jun 15 '17 at 09:50
  • Did you have a look at [How do I convert an existing callback API to promises?](https://stackoverflow.com/q/22519784/1048572)? – Bergi Jun 15 '17 at 09:50

1 Answers1

1
const loadImage = url => new Promise(resolve => {
  utils.loadImage(url, resolve, () => {
    loadImage(url).then(resolve)
  })
})

Edit: Even better version thanks to Bergi's comment:

const loadImage = url => new Promise(resolve => {
  utils.loadImage(url, resolve, () => resolve(loadImage(url)))
})
Sam A. Horvath-Hunt
  • 931
  • 1
  • 7
  • 20
  • 1
    Or best: `const loadImage = url => new Promise((resolve, reject) => utils.loadImage(url, resolve, reject).catch(() => loadImage(url))` – Bergi Jun 16 '17 at 09:53