无法使用 $q 和 promise
unable to use $q and promise
我想使用变量 StatusASof 在 inserthtml 函数中显示数据,如下所示。
App.controller("SS_Ctrl", function ($scope, $http, $location, $window, $sce, $q) {
var ShiftDetails = [];
function getMAStatusASof(Id) {
var defer = $q.defer();
$http({
method: 'GET',
url: 'http://xx/api/Sxxx/GetMAStatusASof',
params: { Id: Id }
}).then(function successCallback(response) {
StatusASof = response.data;
alert("getMAStatusASof : " + StatusASof); --> Got data from API here in this alert.
defer.resolve(response);
}, function errorCallback(response) {});
}
function insertHtml(dates, ShiftDetails, Id) {
// var promise = getMAStatusASof(Id); promise.then(
var defer = $q.defer();
getMAStatusASof(Id);
alert(StatusASof); --> alert says empty here
defer.resolve();
var Content;
Content = '<table class="clsTable"> <tr> <td rowspan="2">Cases ' + $scope.StatusASof + ' </td> <td rowspan="2">Total</td> ';
for (var i = 0; i <= 6; i++) {
if (i == daySeq - 1) {
Content = Content + '<td colspan="3" style="background-color:red"> {{dates[ ' + i + ']}} </td> ';
}
}
}
但 $scope.StatusASof 在显示结果时未定义。看起来 $q.defer 不适合我。
仅从getMAStatusASof(Id)获取数据后如何继续执行代码;
有人可以帮忙吗。
更新
你需要return defer.promise;
function getMAStatusASof(Id) {
var defer = $q.defer();
$http({
method: 'GET',
url: 'http://xx/api/Sxxx/GetMAStatusASof',
params: { Id: Id }
}).then(function successCallback(response) {
StatusASof = response.data;
alert("getMAStatusASof : " + StatusASof); --> Got data from API here in this alert.
defer.resolve(StatusASof);
}, function errorCallback(response) {
deferred.reject(false);
});
return defer.promise;
}
您可以像这样使用此功能:
getMAStatusASof(Id).then(function(res){
if(res){
$scope.StatusASof = res;
}
})
这里不需要使用$q.defer()...
随心所欲
function getMAStatusASof(Id) {
return $http({
method: 'GET',
url: 'http://xx/api/Sxxx/GetMAStatusASof',
params: { Id: Id }
})
.then(function successCallback(response) {
return response.data;
})
.catch(function errorCallback(response) {
return null; //Effectively swallow the error an return null instead.
});
}
然后,使用
getMAStatusASof(Id).then(function(result) {
console.log(result);
});
//No .catch, as we've caught all possible errors in the getMAStatusASof function
如果您真的想使用 $q.defer(),那么函数需要 return defer.promise,就像 Jazib 提到的那样。
但正如我所说,因为 $http 已经 return 是一个承诺,所以做整个 $q.defer() + return defer.promise 多此一举
相反,仅当您需要包装的东西本身不是 return 承诺时才使用该结构。例如,当您打开一个引导框模式并希望在用户单击关闭按钮时得到通知
function notifyMeOfClosing() {
var deferred = $q.defer();
bootbox.confirm("This is the default confirm!", function(result){
if(result) {
deferred.resolve();
}
else {
deferred.reject();
}
});
return deferred.promise;
}
无法使用以下代码更新@Daniël Teunkens post(从“}”到“)”)。所以添加为新答案。
getMAStatusASof(Id).then(function(result) {
// your code here. your HTML content.
....
console.log(result);
})
希望它会起作用。
我想使用变量 StatusASof 在 inserthtml 函数中显示数据,如下所示。
App.controller("SS_Ctrl", function ($scope, $http, $location, $window, $sce, $q) {
var ShiftDetails = [];
function getMAStatusASof(Id) {
var defer = $q.defer();
$http({
method: 'GET',
url: 'http://xx/api/Sxxx/GetMAStatusASof',
params: { Id: Id }
}).then(function successCallback(response) {
StatusASof = response.data;
alert("getMAStatusASof : " + StatusASof); --> Got data from API here in this alert.
defer.resolve(response);
}, function errorCallback(response) {});
}
function insertHtml(dates, ShiftDetails, Id) {
// var promise = getMAStatusASof(Id); promise.then(
var defer = $q.defer();
getMAStatusASof(Id);
alert(StatusASof); --> alert says empty here
defer.resolve();
var Content;
Content = '<table class="clsTable"> <tr> <td rowspan="2">Cases ' + $scope.StatusASof + ' </td> <td rowspan="2">Total</td> ';
for (var i = 0; i <= 6; i++) {
if (i == daySeq - 1) {
Content = Content + '<td colspan="3" style="background-color:red"> {{dates[ ' + i + ']}} </td> ';
}
}
}
但 $scope.StatusASof 在显示结果时未定义。看起来 $q.defer 不适合我。
仅从getMAStatusASof(Id)获取数据后如何继续执行代码;
有人可以帮忙吗。
更新
你需要return defer.promise;
function getMAStatusASof(Id) {
var defer = $q.defer();
$http({
method: 'GET',
url: 'http://xx/api/Sxxx/GetMAStatusASof',
params: { Id: Id }
}).then(function successCallback(response) {
StatusASof = response.data;
alert("getMAStatusASof : " + StatusASof); --> Got data from API here in this alert.
defer.resolve(StatusASof);
}, function errorCallback(response) {
deferred.reject(false);
});
return defer.promise;
}
您可以像这样使用此功能:
getMAStatusASof(Id).then(function(res){
if(res){
$scope.StatusASof = res;
}
})
这里不需要使用$q.defer()...
随心所欲
function getMAStatusASof(Id) {
return $http({
method: 'GET',
url: 'http://xx/api/Sxxx/GetMAStatusASof',
params: { Id: Id }
})
.then(function successCallback(response) {
return response.data;
})
.catch(function errorCallback(response) {
return null; //Effectively swallow the error an return null instead.
});
}
然后,使用
getMAStatusASof(Id).then(function(result) {
console.log(result);
});
//No .catch, as we've caught all possible errors in the getMAStatusASof function
如果您真的想使用 $q.defer(),那么函数需要 return defer.promise,就像 Jazib 提到的那样。
但正如我所说,因为 $http 已经 return 是一个承诺,所以做整个 $q.defer() + return defer.promise 多此一举
相反,仅当您需要包装的东西本身不是 return 承诺时才使用该结构。例如,当您打开一个引导框模式并希望在用户单击关闭按钮时得到通知
function notifyMeOfClosing() {
var deferred = $q.defer();
bootbox.confirm("This is the default confirm!", function(result){
if(result) {
deferred.resolve();
}
else {
deferred.reject();
}
});
return deferred.promise;
}
无法使用以下代码更新@Daniël Teunkens post(从“}”到“)”)。所以添加为新答案。
getMAStatusASof(Id).then(function(result) {
// your code here. your HTML content.
....
console.log(result);
})
希望它会起作用。