首页 > 解决方案 > 向多个调用者返回相同的 Promise 是否错误?

问题描述

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

一旦请求已经完成,cachedRequest()返回Promise.resolve(),因此任何 . then()的连接可以立即触发。

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

全局 Promise 的目的是同时返回请求完成之前的所有调用。在我看来并没有错。

该代码可以正常工作:

// 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);

标签: javascriptpromiseglobalmemoization

解决方案


这是错的吗?

不会。缓存 promise 是一种很好的做法。

它会造成任何内存泄漏吗?

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

一旦请求已经完成,cachedRequest()返回Promise.resolve()

这完全是多余的。它应该只返回returnPromise自请求启动以来已经执行的操作。存储requestCompleted除了returnPromisejust 会使您的代码更加复杂。


推荐阅读