0

I have a basic promise code which works as below

new Promise(function(resolve, reject) {
  new Promise(function(resolveInner, rejectInner) {
    // do something
    resolveInner('resolved inner promise')
  }).then(function(msg) {
    console.log(msg);
    // do something
    resolve("resolved from inner")
  }).catch(function(msg) {
    console.log('error' + msg)
  })
}).then(function(msg) {
  console.log(msg)
})

I am trying to refactor and modularize the code by bringing the innerResolve function outside like below. This errors out as 'resolve' is undefined

new Promise(function(resolve, reject) {
  new Promise(function(resolveInner, rejectInner) {
    // do something
    resolveInner('resolved inner promise')
  }).then(innerResolve) // externalized here !!!!
  .catch(function(msg) {
    console.log('error' + msg)
  })
}).then(function(msg) {
  console.log(msg)
})

function innerResolve(msg) {
  console.log(msg);
  // do something
  resolve("resolved from inner")
}

How do I bring outer Promise resolve to innerResolve function?

One solution is to create a global variable which could be set to outer promise resolve for example.

var _resolve;
new Promise(function(resolve, reject) {
  _resolve = resolve
  new Promise(function(resolveInner, rejectInner) {
    // do something
    resolveInner('resolved inner promise')
  }).then(innerResolve).catch(function(msg) {
    console.log('error' + msg)
  })
}).then(function(msg) {
  console.log(msg)
})

function innerResolve(msg) {
  console.log(msg);
  // do something
  _resolve("resolved from inner")
}

Is there a better approach without global variables?

Faiz Mohamed Haneef
  • 3,418
  • 4
  • 31
  • 41
  • 1
    [Don't do anything like this at all](http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)! – Bergi May 20 '17 at 08:25
  • Can you post your actual code? It looks like there are *many* things wrong with it. – Bergi May 20 '17 at 08:27

1 Answers1

2

Your situation seems really convoluted, so you might want to re-evaluate why you need to do this at all, but if it is simply experimenting, you can solve this without globals, by passing the appropriate resolver to a function generator. For example:

const innerResolve = resolver => msg => {
  console.log(msg);
  // do something
  resolver("resolved from inner")
}

new Promise(function(resolve, reject) {
  new Promise(function(resolveInner, rejectInner) {
    // do something
    resolveInner('resolved inner promise')
  }).then(innerResolve(resolve)).catch(function(msg) {
    console.log('error' + msg)
  })
}).then(function(msg) {
  console.log(msg)
})    
Matt Way
  • 32,319
  • 10
  • 79
  • 85
  • i have a need to promisify an existing library which uses promises. Any best approach other than promisifying without outer promise wrapper? – Faiz Mohamed Haneef May 20 '17 at 08:21
  • 1
    If the existing lib uses promises already, why do you need to promisify it at all? – Matt Way May 20 '17 at 08:22
  • Need to customise the response from this library. I my app, the same code for the customizing response needs to be written. So why not change it one place and return the customised response. Thoughts? – Faiz Mohamed Haneef May 20 '17 at 08:38
  • 2
    Couldn't you simply do `externalLib.someFunc().then(customiseResponse).then(doWork)`? I suggest creating a new question showing more information. – Matt Way May 20 '17 at 08:56