如何 return AngularJS 从异步中承诺 API
How to return AngularJS promise from asynchronous API
AngularJS:Return 来自函数的值
我该如何解决这个问题?
function byDepartment () {
var result = null;
deparmentService.query({
codDepartment: vm.codDepartment.codDepartment,
reportBycodDepartment: 1
}, function (data) {
var success = JSON.stringify(data.success);
if (success === false) {
console.log(JSON.stringify(data.data));
result = data.message;
} else {
result = data.data;
console.log('Always has a value: ' + result);
}
});
console.log('Always null: ' + result);
return result;
}
Chrome 的控制台回答这个问题:
始终为空:空
总是有一个值:[object Object],[object Object]
我想在之后的下一个函数中使用这个值:
vm.updateChart = function () {
vm.testValue = 0;
if (!vm.codTestRoom) {
console.log('consulta con departamento');
vm.testValue = byDepartment();
} else if (!vm.codEquipment) {
console.log('Consulta con departamento y testRoom');
vm.testValue = byDepartmentAndTestRoom();
} else {
console.log('Consulta con departamento, testRoom y Equipo');
vm.testValue = byDepartmentAndTestRoomAndEquipment();
}
// console.log('Valor: ' + JSON.stringify(vm.testValue));
};
在 vm.testValue 之后,我将用 chart.js 绘制图表..
谢谢。
发生这种情况是因为您正在进行异步调用,但处理它时却像处理同步一样。
在 angularjs 中,与在常规 javascript 中一样,等待异步调用的一种解决方案是使用 promises。
在 angularjs 中,$q provider 可以轻松创建承诺,这将帮助您使用 defer() 方法创建新的承诺。
下面是你如何实现它(记得注入 $q)
function byDepartment () {
var deferred = $q.defer();
var result = null;
deparmentService.query({
codDepartment: vm.codDepartment.codDepartment,
reportBycodDepartment: 1
}, function (data) {
var success = JSON.stringify(data.success);
if (success === false) {
deferred.reject(data.message);
} else {
deferred.resolve(result.data);
}
});
return deferred.promise;
}
当调用 byDepartment() 方法时,您需要通过将一个成功函数和一个错误函数传递给 promise 上的 then() 方法来告诉返回的 promise 成功时和不成功时应该发生什么
vm.updateChart = function () {
vm.testValue = 0;
if (!vm.codTestRoom) {
console.log('consulta con departamento');
byDepartment()
.then(
function (result) {
vm.testValue = result;
},
function (message) {
console.log(error);
}
);
} else if (!vm.codEquipment) {
console.log('Consulta con departamento y testRoom');
vm.testValue = byDepartmentAndTestRoom();
} else {
console.log('Consulta con departamento, testRoom y Equipo');
vm.testValue = byDepartmentAndTestRoomAndEquipment();
}
// console.log('Valor: ' + JSON.stringify(vm.testValue));
};
AngularJS:Return 来自函数的值
我该如何解决这个问题?
function byDepartment () {
var result = null;
deparmentService.query({
codDepartment: vm.codDepartment.codDepartment,
reportBycodDepartment: 1
}, function (data) {
var success = JSON.stringify(data.success);
if (success === false) {
console.log(JSON.stringify(data.data));
result = data.message;
} else {
result = data.data;
console.log('Always has a value: ' + result);
}
});
console.log('Always null: ' + result);
return result;
}
Chrome 的控制台回答这个问题: 始终为空:空 总是有一个值:[object Object],[object Object]
我想在之后的下一个函数中使用这个值:
vm.updateChart = function () {
vm.testValue = 0;
if (!vm.codTestRoom) {
console.log('consulta con departamento');
vm.testValue = byDepartment();
} else if (!vm.codEquipment) {
console.log('Consulta con departamento y testRoom');
vm.testValue = byDepartmentAndTestRoom();
} else {
console.log('Consulta con departamento, testRoom y Equipo');
vm.testValue = byDepartmentAndTestRoomAndEquipment();
}
// console.log('Valor: ' + JSON.stringify(vm.testValue));
};
在 vm.testValue 之后,我将用 chart.js 绘制图表..
谢谢。
发生这种情况是因为您正在进行异步调用,但处理它时却像处理同步一样。 在 angularjs 中,与在常规 javascript 中一样,等待异步调用的一种解决方案是使用 promises。
在 angularjs 中,$q provider 可以轻松创建承诺,这将帮助您使用 defer() 方法创建新的承诺。 下面是你如何实现它(记得注入 $q)
function byDepartment () {
var deferred = $q.defer();
var result = null;
deparmentService.query({
codDepartment: vm.codDepartment.codDepartment,
reportBycodDepartment: 1
}, function (data) {
var success = JSON.stringify(data.success);
if (success === false) {
deferred.reject(data.message);
} else {
deferred.resolve(result.data);
}
});
return deferred.promise;
}
当调用 byDepartment() 方法时,您需要通过将一个成功函数和一个错误函数传递给 promise 上的 then() 方法来告诉返回的 promise 成功时和不成功时应该发生什么
vm.updateChart = function () {
vm.testValue = 0;
if (!vm.codTestRoom) {
console.log('consulta con departamento');
byDepartment()
.then(
function (result) {
vm.testValue = result;
},
function (message) {
console.log(error);
}
);
} else if (!vm.codEquipment) {
console.log('Consulta con departamento y testRoom');
vm.testValue = byDepartmentAndTestRoom();
} else {
console.log('Consulta con departamento, testRoom y Equipo');
vm.testValue = byDepartmentAndTestRoomAndEquipment();
}
// console.log('Valor: ' + JSON.stringify(vm.testValue));
};