Javascript AngularJS承诺在下次用户交互之前不会更新GUI

Javascript AngularJS承诺在下次用户交互之前不会更新GUI,javascript,angularjs,Javascript,Angularjs,我正在AngularJS中使用Angular2样式的组件。在我的组件中,我有一个通过更改下拉菜单选项来更新GUI的功能: var ctrl = this; async function updateOptions(node) { var name = node.name; let result = await MyService.getResult(name); ctrl.options = result;

我正在AngularJS中使用Angular2样式的组件。在我的组件中,我有一个通过更改下拉菜单选项来更新GUI的功能:

    var ctrl = this;
    async function updateOptions(node) {
          var name = node.name;
          let result = await MyService.getResult(name);
          ctrl.options = result;
          console.log(ctrl.options); 
    }
显示这些选项的对应HTML为:

  <select ng-if="$ctrl.getType() === 'dropdown'"
    class="form-control selectList"
    ng-model="$ctrl.value"
    ng-options="option.key as option.displayName for option in $ctrl.options">
  </select>
我的工厂代码:

myFactory.getStuff = function(name) {
  return $http.get('/url/here/' + name)).then(
      function(response) {
        return response.data;
      }
    );
};

wait
用于浏览器支持的本机承诺。您还可以对本机承诺使用
。然后使用
语法

但AngularJS使用自己的承诺,这些承诺来自
$q
服务。因此,您需要使用
。然后使用
语法,因为浏览器不知道这些承诺


当您使用
$q
服务的承诺时(例如,当您使用
$http
时),您不必担心摘要周期,因为当承诺兑现时,会为您运行摘要。但是如果你在AngularJS中使用本机承诺,你通常必须手动运行摘要循环。

AngularJS使用
$q
服务的承诺,该服务将为你运行摘要。如果您使用的是本机承诺,我认为您需要手动运行摘要。@FrankModica发布
getResult
方法的代码会有帮助吗?不幸的是,我不熟悉$q服务,但我现在要读一读。在AngularJS中,人们通常使用内置的
$http
服务获得API结果,我相信这会返回从
$q
服务创建的承诺。因此,当接收到AJAX响应时,会自动为您运行摘要周期。如何实现
getResult
?它是否返回了本机承诺?使用
。然后
语法而不是
wait
似乎起到了作用。但为了完整起见,我仍然包含了上面要求的详细信息。也许你可以在下面发布一个简短的回答,解释为什么这样做有效。非常感谢你的帮助。老实说,我很惊讶它以前居然能工作一次
await
应该适用于本机承诺,但不适用于
$q
中的承诺!术语“摘要”未出现在
$q
的AngularJS文档中。也许你可以提供一个链接到一个好的资源,解释角度“摘要”的方式/时间。摘要周期是AngularJS中的一个基本概念(框架是如何完成更改检测的)。AngularJS已经离开太久了,谷歌搜索会为你提供大量高质量的解释。一旦你理解了摘要周期,你真的只需要知道,
$q
在你使用它的承诺时会触发摘要周期。我不确定在AngularJS中使用Angular2样式的组件时是否有办法手动运行摘要周期<例如,代码>$apply
$digest
不可用。我可以通过将更新代码放入
this.$doChange
函数中来正确更新某些内容,其中
this
是控制器。您尝试在哪个对象上调用
$digest
?您可能需要注入
$scope
myFactory.getStuff = function(name) {
  return $http.get('/url/here/' + name)).then(
      function(response) {
        return response.data;
      }
    );
};