欢迎来到承诺(d)地狱;-)
Welcome to promise(d) hell ;-)
我想仅使用 promise 异步加载一些文件,并编写了以下解决方案:
function create(ids, $q, http) {
var promises = [];
_.each(ids, function(id) {
var item = http.get('catalog/' + id + '.json').then(function (response) {
return {id: id, item: response.data};
}, function(reason) {
console.log(reason.config.url, reason.statusText, reason.status);
});
promises.push(item);
});
return $q.all(promises).then(function(values) {
var catalog = {};
var svgPromises = [];
_.each(values, function(value) {
catalog[value.id] = value.item;
var svg = http.get('catalog/' + value.item.svg).then(function (response) {
return {id: value.id, svg: response.data};
}, function(reason) {
console.log(reason.config.url, reason.statusText, reason.status);
});
svgPromises.push(svg);
});
return $q.all(svgPromises).then(function(values) {
_.each(values, function(value) {
catalog[value.id].svg = value.svg;
});
return catalog;
});
});
}
我真的不喜欢它,我知道我可以用地图做得更好一点,但我不相信,我做得对。有谁知道如何做得更好?
function create(ids, $q, http) {
var catalog = {};
return $q.all(_.map(ids, function(id) {
return http.get('catalog/' + id + '.json')
.then(function(response) {
catalog[id] = {id: id, item: response.data};
return http.get('catalog/' + response.data.svg);
})
.then(function(response) {
catalog[id].svg = response.data;
})
.catch(function(e) {
console.log(e.config.url, e.statusText, e.status);
});
})).then(function() {
return catalog;
});
}
创建第三个延迟对象,然后我们仅在所有调用完成后解析延迟对象怎么样?(下面的代码中可能有一些错误,因为我无法测试它,但希望这个想法很清楚)
function create(ids, $q, http) {
var promises = [];
var catalog = {};
_.each(ids, function (id) {
var svgDef = $q.defer();
http.get('catalog/' + id + '.json')
.then(
function (response) {
var value = {id: id, item: response.data};
catalog[value.id] = value.item;
http.get('catalog/' + value.item.svg)
.then(
function (response) {
catalog[value.id].svg = response.data;
svgDef.resolve(catalog[value.id]);
},
function (reason) {
console.log(reason.config.url, reason.statusText, reason.status);
svgDef.reject(reason);
});
},
function (reason) {
console.log(reason.config.url, reason.statusText, reason.status);
svgDef.reject(reason);
});
promises.push(svgDef.promise);
});
return $q.all(promises)
.then(function () {
return catalog;
})
}
相关文章:
- 我的职位回报太快了,如何做出承诺
- 打破承诺链的好方法是什么
- 从函数返回角度承诺
- 我怎样才能获得承诺的价值
- 延期承诺值未更新/解析/延期
- 在承诺链中处理早期回报的最佳方式
- 承诺在非节点式回调上使用Bluebird
- 简单的ES6承诺问题-交换解决和拒绝参数
- 组合承诺和非承诺值
- 带有对象/原型的链式承诺(Q延期)
- AngularJS$q承诺使用socket.io
- React JS:未捕获(在承诺中)语法错误:在位置 0 的 JSON 中意外<令牌
- 欢迎来到承诺(d)地狱;-)
- 我如何使用承诺重构这个回调地狱
- 包装现有的API'在承诺避免“;回调地狱”;
- 回调地狱与承诺
- 我如何运行async承诺没有承诺地狱
- 避免回调地狱.流星.叫承诺
- 如何将回调地狱重写为承诺
- 避免javascript回调和承诺地狱