【发布时间】:2018-07-24 20:57:25
【问题描述】:
使用 jQuery 承诺我执行以下操作来管理我有多个实例需要调用外部资源的情况,但我不想多次调用相同的外部资源。
- 初始 REST 调用让我获得 多个 数据对象,其中包含对附加信息的引用(在示例中,“部门”属性提供了一个引用,表明我可以在哪里找到有关部门的更多信息)。
{ “一些数据”: ”...”, "部门": "https://api.../departments/1000", }
已经深入到每个数据对象的单独函数调用中,我希望协调对相同资源的所有调用。我不想多次获取“部门 1000”的部门名称。
-
我将承诺或返回的结果保存在字典中并重复使用。
一个。如果它是一个 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;
}
这似乎可行,但我担心这是否是一个很棒的设计。我有几个问题。
- 我应该使用一些承诺功能吗?
- 是否有任何事情可能以错误的顺序发生的情况?
- 这样重用 promise 实例是否正确?多个调用者对同一个 promise 对象的 .then 进行调用,它似乎运行良好,但我不知道当 promise 被解析时 jQuery 是如何链接所有这些接收者的。
【问题讨论】:
标签: javascript promise