向多个调用者返回相同的 Promise 是错误的吗?

Is returning the same Promise to multiple callers wrong?

我创建了一个 AngularJS 服务来处理和缓存对给定资源的请求。

一旦请求已经完成,cachedRequest() returns Promise.resolve(),这样任何 .then() 连接都可以立即触发。

然而,如果请求没有完成,但已经启动,cachedRequest()return是它在第一次调用时创建的同一个全局 Promise。 有错吗?它会造成任何内存泄漏吗?

全局 Promise 的目的是 return 同时对请求完成之前进行的所有调用。我觉得没问题。

代码运行无误:

// The request function which should only be called once
function request(callback) { console.log("Doing stuff only once..."); setTimeout(callback, 5000); }

// Holds global request status (completed/not completed)
var requestCompleted = false;
// Holds global promise
var returnPromise = null;

// The interface for the request function
function cachedRequest() {

  // Request results already available
  // Returning Promise.resolve() to trigger .then()s
  if(requestCompleted){
    return Promise.resolve(requestCompleted);

  // Request result not available (not initiated or not completed)
  }else{
    // Request was initiated
    if(returnPromise){
      // IS THIS WRONG?
      return returnPromise;
    
    // Request not initiated
    }else{
      // Creates and stores the promise 
      returnPromise = new Promise(function (resolve, reject) {
        request(function () {
          requestCompleted = true;
          resolve(requestCompleted);
        });
      });
      // Returns the promise
      return returnPromise;
    }
  }
}


/////////////////

function doRequestAndPrint(n) {
  console.log("Request " + n);
  cachedRequest()
    .then((value)=>{
      console.log("Returned " + n);
    })
}

//////////////////////////////

doRequestAndPrint(1);

setTimeout(()=>{doRequestAndPrint(2)}, 2000);

setTimeout(()=>{doRequestAndPrint(3)}, 10000);

Is it wrong?

没有。缓存承诺是一种很好的做法。

Does it create any memory leaks?

没有。当然,它会将承诺结果保存在内存中,但这是故意的,而不是泄漏。

Once the request has already been completed, cachedRequest() returns Promise.resolve()

这完全是多余的。它应该只是 return returnPromise 就像自请求发起以来已经做的那样。除了 returnPromise 之外还存储 requestCompleted 只会使您的代码更加复杂。