我有一个调用服务的控制器,服务做异步工作,当工作(Promise
)完成时,我在控制器的作用域对象上设置一个属性。
function TodoController(TodosService) {
let self = this;
TodosService.fetchTodos().then((todos) => (self.todos = todos));
... other code here
}
问题在于,在服务中使用async/await不会在promise解决后更新html呈现的元素,但使用then
可以正常工作,并使用获取的todos更新呈现的元素:
app.service("TodosService", function ($http) {
// This code does not work, it fetches the todos successfully and also the controller succesfully sets them as a property, but no visual change happens
// this.fetchTodos = async function () {
// let json = await $http.get("...");
// return json.data["todos"];
// };
// This code works normally as explained above
this.fetchTodos = () =>
$http
.get("...")
.then((json) => json.data["todos"]);
}
这两种情况之间有什么区别,因为AFAIK(我是JS的新手)async
函数和$http.get(...).then(...)
都将返回promises,那么我在这里遗漏了什么呢?
1条答案
按热度按时间osh3o9ms1#
await
~将您的代码 Package 到本机Promise中,并将后面的代码放入回调中。$http
运行http请求,然后触发$digest
因此
TodosService.fetchTodos().then((todos) => (self.todos = todos));
行u使用await时将:todos
字段当你看到摘要时,不会看到你的更改。
P.S.事情可能会有点复杂,因为
$http
可能会触发异步摘要(当useApplyAsync
设置为true时),然后此代码有时可能会与await
一起工作(?),但无论如何都是不可靠的。