excuse me, what are you going to do? Do you follow the queue or something? 
 paste a jsfiddle, which is executed according to the queue 
  https://jsfiddle.net/weisiwu/.
  the resolve of a promise can only be used once, and the second time is invalid. 
 you need RxJs 
 
The problem with 
 is that this is not a queue, but that  foreach  executes  promise  and recurses it. 
function doThing(file) {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('doThing', file)
      resolve('result:' + file)
    }, 500)
  })
}
function queue(files, data = []) {
  return new Promise((resolve) => {
    if (files.length > 0) {
      let file = files.shift();
      doThing(file).then((res) => {
        data.push(res)
        resolve(queue(files, data))
      })
    } else {
      resolve(data)
    }
  })
}
queue(['file1', 'file2', 'file3']).then(data => {
  console.log(data);
});
 I don't know, do you want to achieve serial upload or parallel upload? 
 / / below is 
 function queue (arr, handle) {
 let index = 0 
 let length = arr.length 
 return new Promise ((resolve, reject) = > {
!(function next() {
  try {
    handle(arr[index])
      .then(function () {
        PPindex < length
          ? next()
          : resolve()
      })
      .catch(reject)
  } catch (err) {
    reject(err)
  }
})()
}) 
} 
 function upload (file) {
 return new Promise ((resolve, reject) = > {
// 
setTimeout(function () {
  console.log(`upload ${file}`)
  resolve()
}, file * 1000 )
}) 
} 
 queue (['3,'2,'1'], upload). Then (data = > {
 console.log ('ok'); 
}) .catch (err = > {
 console.log (' error', err) 
}) 
)
 Let me make some comments on your code and see for yourself what the problem is 
.
// 
function queue(files) {
  // Promise.resolve(val)Promisepromise
  // promiseResolved
  // promisethenResolvedval(valundefined)
  let promise = Promise.resolve(); 
  
  // 
  files.forEach(file => {
    // promisethen,thenpromiseresolve
    // 
    // resolve()
    // rejectundefined
    promise = promise.then(() => { 
    // then.resolvePromise
    // "resolve"promiseresolve,reject
      return new Promise(resolve => { 
         // Promiseresolve
         doThing(file, () => { 
             
             //
             // resolvepromise
             // data
             resolve();
           });
      });
    });
  });
  // promisepromise
  return promise;
}
// queue
// 
// , resolvethen
queue([file1, file2, file3]) 
//promiseresolve
.then(data => { 
  // resolve
  console.log(data); 
});
 in addition, I also have a note from learning promise here. You can review 
  my Promise notes  
.
 there is no problem with your queue, but you didn't return data in the end. If you need data, you can return it in  resolve () . 
 in addition, I would like to introduce myself to my lecture hall: n uses of Promise , which not only introduces the various uses of Promise in detail, but also writes about the handling of two kinds of queues.