为什么在这种情况下使用async/await对AngularJS服务不起作用?

0md85ypi  于 2022-10-31  发布在  Angular
关注(0)|答案(1)|浏览(202)

我有一个调用服务的控制器,服务做异步工作,当工作(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,那么我在这里遗漏了什么呢?

osh3o9ms

osh3o9ms1#

await ~将您的代码 Package 到本机Promise中,并将后面的代码放入回调中。
$http运行http请求,然后触发$digest
因此TodosService.fetchTodos().then((todos) => (self.todos = todos));行u使用await时将:

  • 运行http请求
  • 运行摘要
  • 更改控制器todos字段

当你看到摘要时,不会看到你的更改。
P.S.事情可能会有点复杂,因为$http可能会触发异步摘要(当useApplyAsync设置为true时),然后此代码有时可能会与await一起工作(?),但无论如何都是不可靠的。

相关问题