【问题标题】:Javascript reusing promise to manage multiple callsJavascript重用promise来管理多个调用
【发布时间】:2018-07-24 20:57:25
【问题描述】:

使用 jQuery 承诺我执行以下操作来管理我有多个实例需要调用外部资源的情况,但我不想多次调用相同的外部资源。

  1. 初始 REST 调用让我获得 多个 数据对象,其中包含对附加信息的引用(在示例中,“部门”属性提供了一个引用,表明我可以在哪里找到有关部门的更多信息)。

{ “一些数据”: ”...”, "部门": "https://api.../departments/1000", }

  1. 已经深入到每个数据对象的单独函数调用中,我希望协调对相同资源的所有调用。我不想多次获取“部门 1000”的部门名称。

  2. 我将承诺或返回的结果保存在字典中并重复使用。

    一个。如果它是一个 Promise,我会返回相同的 Promise 以供调用者重用。

    b.如果它是一个获取的值,我会通过使用超时来异步解决 Promise。

代码如下:

var Departments = {};

function getDepartmentName(id){
   var dfd = new $.Deferred();
   var promise = dfd.promise();

   if(id in Departments){
        if(typeof Departments[id] == 'object'){
            return Departments[id];//reuse the promise
        }else{//department name is a string
            setTimeout(function(){ dfd.resolve(Departments[id]); }, 0);         
        }
   }

   else{
       Departments[id] = promise;//Set dictionary value to the promise
       var dPromise = FetchDepartment('https://api.../departments/'+id);
       $.when(dPromise).then(
           function(departmentName){
               Departments[id] = departmentName;//Re-set dictionary value to the fetched value
               dfd.resolve(departmentName);
           },
           function(err){
               delete Departments[id]; 
               dfd.reject('Call failed');
           }
       );   
   }
   return promise;

}

这似乎可行,但我担心这是否是一个很棒的设计。我有几个问题。

  1. 我应该使用一些承诺功能吗?
  2. 是否有任何事情可能以错误的顺序发生的情况?
  3. 这样重用 promise 实例是否正确?多个调用者对同一个 promise 对象的 .then 进行调用,它似乎运行良好,但我不知道当 promise 被解析时 jQuery 是如何链接所有这些接收者的。

【问题讨论】:

    标签: javascript promise


    【解决方案1】:

    我将承诺或返回的结果保存在字典中并重用它们。如果它是一个获取的值,我会通过使用超时来异步解决承诺。

    不要把它弄得这么复杂。这与您只是遵守承诺并仅返回它的行为完全相同,而不是在最初的承诺完成后为调用创建新的承诺。

    另外,avoid deferreds 当您已经在处理承诺时。

    var Departments = {};
    
    function getDepartmentName(id) {
        if (id in Departments){
            return Departments[id]; //reuse the promise
        } else {
           var promise = FetchDepartment('https://api.../departments/'+id).then(null, function(err){
                delete Departments[id]; // allow retries
                throw err;
            });   
            return Departments[id] = promise;
        }
    }
    

    像这样重用一个promise实例是否正确,多个调用者调用同一个promise对象的.then?

    是的,这完全没问题。他们的回调将按照与then 的发起调用相同的顺序安排。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    相关资源
    最近更新 更多