From 9cf8b140d05e88fbf5acc3ba2ebec4a90ae051c1 Mon Sep 17 00:00:00 2001 From: johnjbarton Date: Wed, 20 Jun 2018 09:56:15 -0700 Subject: [PATCH] refactor(filelist): rename promise -> lastCompletedRefresh and remove unused promise --- lib/file-list.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/file-list.js b/lib/file-list.js index 887a9d71e..1a459d569 100644 --- a/lib/file-list.js +++ b/lib/file-list.js @@ -29,7 +29,14 @@ class FileList { this.buckets = new Map() - this._refreshing = Promise.resolve() + + // Internal tracker if we are refreshing. + // When a refresh is triggered this gets set + // to the promise that `this._refresh` returns. + // So we know we are refreshing when this promise + // is still pending, and we are done when it's either + // resolved or rejected. + this._refreshing = null const emit = () => { this._emitter.emit('file_list_modified', this.files) @@ -65,8 +72,8 @@ class FileList { _refresh () { const matchedFiles = new Set() - let promise - promise = Promise.map(this._patterns, (patternObject) => { + let lastCompletedRefresh = this._refreshing + lastCompletedRefresh = Promise.map(this._patterns, (patternObject) => { const pattern = patternObject.pattern const type = patternObject.type @@ -113,14 +120,18 @@ class FileList { }) }) .then(() => { - if (this._refreshing !== promise) { + // When we return from this function the file processing chain will be + // complete. In the case of two fast refresh() calls, the second call + // will overwrite this._refreshing, and we want the status to reflect + // the second call and skip the modification event from the first call. + if (this._refreshing !== lastCompletedRefresh) { return this._refreshing } this._emitModified(true) return this.files }) - return promise + return lastCompletedRefresh } get files () {