向多个呼叫者返回相同的Promise是错误的吗?

时间:2018-05-04 15:10:47

标签: javascript promise global memoization

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

请求完成后, cachedRequest()返回 Promise.resolve(),以便任何。 then() s可以立即触发连接。

但是,如果请求未完成但已启动, cachedRequest()将返回它在第一次调用时创建的相同全局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);




1 个答案:

答案 0 :(得分:2)

  

是不是错了?

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

  

是否会造成任何内存泄漏?

没有。当然,它将承诺结果留在记忆中,但这不是故意泄漏。

  

请求完成后,Promise.resolve()会返回returnPromise

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