Search code examples
javascriptes6-promise

Can I resolve a Promise inside another resolved Promise?


I'm writing a method to iterate through a series of items to find either the next incomplete or the last one that returns a promise.

The item status is fetched by another method that also returns a promise and I'm trying to resolve/reject within the resolve callback of this method.

Simplified version of my attempt below:

export const findNextEntry = (i) => {
  let length = entries.length
  let entry = entries[i]
  entry.isLastEntry = i + 1 >= length

  return new Promise((resolve, reject) => {
    getEntryStatus(i).then(() => {
      if (entry.status.complete) {
        if ((i + 1) < length) {
          findNextEntry(i + 1)
        } else {
          reject('no more entries')
        }
      } else {
        resolve('entry set')
      }
    })
  })

And then I call the method:

findNextEntry(entry.number).then((resolve) => {
   console.log(resolve)
}, (reject) => {
   console.log(reject)
})

The resolve/reject callbacks don't seem to be firing, and I get an error Uncaught (in promise) no more entries.


Solution

  • Probebly you must call reject/resolve for nested iterations

    export const findNextEntry = (i) => {
      let length = entries.length
      let entry = entries[i]
      entry.isLastEntry = i + 1 >= length
    
      return new Promise((resolve, reject) => {
        getEntryStatus(i).then(() => {
          if (entry.status.complete) {
            if ((i + 1) < length) {
              findNextEntry(i + 1).then(resolve).catch(reject)
            } else {
              reject('no more entries')
            }
          } else {
            resolve('entry set')
          }
        })
      })
    

    Similar but more simple code

    function test(i = 0) {
        console.log(i);
        return new Promise((resolve, reject) => {
            if (i < 10) test(i + 1).then(resolve).catch(reject);
            else resolve('done');
        });
    }
    
    
    test();