Javascript 为什么在运行成功回调之前要解决承诺?
我有这样的代码Javascript 为什么在运行成功回调之前要解决承诺?,javascript,jquery,promise,jquery-deferred,Javascript,Jquery,Promise,Jquery Deferred,我有这样的代码 var addExpenses = function(parent) { return function(data) { if (data) { for (var i = 0; i < data.length; i++) { var expenditure = data[i].RestrictedExpenditure; expenditure = parseFl
var addExpenses = function(parent) {
return function(data) {
if (data) {
for (var i = 0; i < data.length; i++) {
var expenditure = data[i].RestrictedExpenditure;
expenditure = parseFloat(expenditure);
var child = {level: 4, name: data[i].Name, size: expenditure, children: []};
parent.children.push(child);
}
}
}
}
var addSubActivities = function(parent) {
return function(data) {
if (data) {
for (var i = 0; i < data.length; i++) {
var expenditure = data[i].Expenditure;
expenditure = parseFloat(expenditure);
if (expenditure < 0) {
expenditure = -expenditure;
}
var child = {level: 3, name: data[i].Name, size: expenditure, children: []};
parent.children.push(child);
subActivitiesDfds.push($.getJSON("http://localhost:8080/district/1/subActivities/" + data[i].Code + "/expenses", addExpenses(child)));
// subActivitiesDfds.push(dfd);
}
}
}
}
for (var i = 0; i < data.length; i++) {
var expenditure = data[i].Expenditure;
expenditure = parseFloat(expenditure);
total += expenditure;
var child = {level: 2, name: data[i].Name, size: expenditure, children: []};
root.children.push(child);
subActivitiesDfds.push($.getJSON("http://localhost:8080/district/1/activities/" + data[i].Code + "/subActivities", addSubActivities(child)));
// subActivitiesDfds.push(dfd);
}
root.size = total;
$.when.apply($, subActivitiesDfds).done(function() {
- 儿童是未定义的。这是因为partition.nodes(root)破坏了父属性,这是因为在调用addExpenses回调之前解析了承诺列表李>
为什么?出现此问题是因为在执行.apply($,subactivitesdfds)时,
subactivitesdfds
仅填充顶级承诺。生成下一级承诺的代码仅在顶级承诺实现时运行
要修复此问题,您需要:
- 确保所有处理完成后,
返回承诺addSubActivities()
- 将
替换为$.getJSON(…,fn)
$.getJSON(…,)。然后在两个位置(fn)
array.map()
便于构建承诺数组
尝试:
var addExpenses=函数(父级){
返回函数(数据){
如果(数据){
对于(变量i=0;i
顶级的
承诺
数组仍然只填充顶级承诺,但现在链接的.then()
s确保每个承诺只有在其所有同步和异步子活动完成时才会得到解决。通常情况下,在调用成功回调之前解决承诺不是正确的。我以一个$.getJSON()
jsFiddle的工作示例为例,在成功处理程序和承诺中添加了一个console.log()
。然后()
解析处理程序,这里首先明确地调用成功处理程序:。所以,你的代码中肯定还有其他东西。
parent.children.push(child);
var addExpenses = function(parent) {
return function(data) {
if (data) {
for (var i = 0; i < data.length; i++) {
var child = {
level: 4,
name: data[i].Name,
size: parseFloat(data[i].RestrictedExpenditure),
children: []
};
parent.children.push(child);
}
}
}
}
var addSubActivities = function(parent) {
return function(data) {
if (data) {
var promises = data.map(function(item) {
var child = {
level: 3,
name: item.Name,
size: Math.abs(parseFloat(item.Expenditure)),
children: []
};
parent.children.push(child);
return $.getJSON("http://localhost:8080/district/1/subActivities/" + item.Code + "/expenses")
.then(addExpenses(child));
});
return $.when.apply($, promises);
} else {
return $.when();//resolved promise
}
}
}
var promises = data.map(function(item) {
var child = {
level: 2,
name: item.Name,
size: parseFloat(item.Expenditure),
children: []
};
root.children.push(child);
total += child.size;
return $.getJSON("http://localhost:8080/district/1/activities/" + item.Code + "/subActivities").then(addSubActivities(child));
});
root.size = total;
$.when.apply($, promises).then(function() {
var nodes = partition.nodes(root); //render
});