Angular 无法解决承诺
Angular cannot resolve promise
我创建了一个通过 $http.post.
与服务器通信的服务
app.factory("dataService", [
"$http", "$q", "$timeout", function ($http, $q) {
function post(url, data) {
var deferred = $q.defer();
$http.post(url, data)
.success(function (result) {
deferred.resolve(result);
})
.error(function (error) {
deferred.reject(error);
});
return deferred.promise;
}
return {
post: post
};
在我正在做的控制器中:
dataService.get(someUrl,someData).
then(function (data) {
$scope.result = data;
});
一切正常,但如果我在其他服务中调用这个通用 "dataService",例如:
app.factory("userService", ["$http", "$q","dataService", function ($http, $q,dataService) {
function postUser(user) {
dataService.post(usersUrl, user);
}
return {
postUser: postUser
};
}
并在控制器中调用此 "userService"
userService.postUser($scope.user).then(){}
,我收到以下错误:
谁能解释一下为什么会这样?
试试这个:
app.factory("dataService", [
"$http", "$timeout", function ($http) {
function post(url, data) {
return new Promise(function(resolve, reject) {
$http.post(url, data)
.success(function (result) {
resolve(result)
})
.error(function (error) {
resolve(error)
});
});
}
return {
post: post
};
和
app.factory("userService", ["$http", "$q","dataService", function ($http, $q,dataService) {
function postUser(user) {
return dataService.post(usersUrl, user);
}
// OR
function postUser(user,callback) {
dataService.post(usersUrl, user).then(function(data){callback(data);});
}
return {
postUser: postUser
};
}
希望对您有所帮助 ;)
More info here
我找到了解决办法。只需要将已解决的承诺分配给变量,然后 return 该变量。
function postUser(user) {
var result = dataService.post(usersUrl,user);
return result;
};
您不需要使用 $q
here.There 有一些 angular 服务 return 和 $promise
,例如 $http,$timeout,$interval
.因此,您不应在此处使用 $q
,因为承诺已被 $http
服务 return 编辑。
您的服务应如下所示:
.factory('myService', function($http) {
return {
postMyData : function(){
return $http.post(data);
}
此时您已经有了 return 由 $http
angular 服务编辑的承诺。现在你可以随心所欲地解决它( controller )。
例如:
var myPromise = myService.postMyData(data).
myPromise.then(function(){//success
},function(){//error
},function(){//inform that action is in progress
})
如果您调用 userService.postUser($scope.user).then(){}
userService
中的函数,应该 return 承诺:
function postUser(user) {
return dataService.post(usersUrl, user);
}
我创建了一个通过 $http.post.
与服务器通信的服务app.factory("dataService", [
"$http", "$q", "$timeout", function ($http, $q) {
function post(url, data) {
var deferred = $q.defer();
$http.post(url, data)
.success(function (result) {
deferred.resolve(result);
})
.error(function (error) {
deferred.reject(error);
});
return deferred.promise;
}
return {
post: post
};
在我正在做的控制器中:
dataService.get(someUrl,someData).
then(function (data) {
$scope.result = data;
});
一切正常,但如果我在其他服务中调用这个通用 "dataService",例如:
app.factory("userService", ["$http", "$q","dataService", function ($http, $q,dataService) {
function postUser(user) {
dataService.post(usersUrl, user);
}
return {
postUser: postUser
};
}
并在控制器中调用此 "userService"
userService.postUser($scope.user).then(){}
,我收到以下错误:
谁能解释一下为什么会这样?
试试这个:
app.factory("dataService", [
"$http", "$timeout", function ($http) {
function post(url, data) {
return new Promise(function(resolve, reject) {
$http.post(url, data)
.success(function (result) {
resolve(result)
})
.error(function (error) {
resolve(error)
});
});
}
return {
post: post
};
和
app.factory("userService", ["$http", "$q","dataService", function ($http, $q,dataService) {
function postUser(user) {
return dataService.post(usersUrl, user);
}
// OR
function postUser(user,callback) {
dataService.post(usersUrl, user).then(function(data){callback(data);});
}
return {
postUser: postUser
};
}
希望对您有所帮助 ;)
More info here
我找到了解决办法。只需要将已解决的承诺分配给变量,然后 return 该变量。
function postUser(user) {
var result = dataService.post(usersUrl,user);
return result;
};
您不需要使用 $q
here.There 有一些 angular 服务 return 和 $promise
,例如 $http,$timeout,$interval
.因此,您不应在此处使用 $q
,因为承诺已被 $http
服务 return 编辑。
您的服务应如下所示:
.factory('myService', function($http) {
return {
postMyData : function(){
return $http.post(data);
}
此时您已经有了 return 由 $http
angular 服务编辑的承诺。现在你可以随心所欲地解决它( controller )。
例如:
var myPromise = myService.postMyData(data).
myPromise.then(function(){//success
},function(){//error
},function(){//inform that action is in progress
})
如果您调用 userService.postUser($scope.user).then(){}
userService
中的函数,应该 return 承诺:
function postUser(user) {
return dataService.post(usersUrl, user);
}