Javascript 为什么子状态解析函数在父状态承诺解析之前执行

Javascript 为什么子状态解析函数在父状态承诺解析之前执行,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,我正在使用ui路由器v0.2.13。声明: 一个状态上的所有解析都将在转到下一个状态之前解析 下一个州,即使他们没有注射到那个孩子身上 还有更多 所有输入状态的所有解析都会被触发,并且 转换前的resolvesd将进入任何状态(无论 在某处注入的决心) 然而,在我的例子中,子状态解析函数是在解析父级的解析承诺之前执行的。这怎么可能 在这里: 如果导航到/route1/list将立即显示警报,而不是等待5秒直到父级解决承诺得到解决。因此,实际情况是,由于您没有将“父级”注入已解决的子级路由,因此它

我正在使用
ui路由器
v0.2.13。声明:

一个状态上的所有解析都将在转到下一个状态之前解析 下一个州,即使他们没有注射到那个孩子身上

还有更多

所有输入状态的所有解析都会被触发,并且 转换前的resolvesd将进入任何状态(无论 在某处注入的决心)

然而,在我的例子中,子状态解析函数是在解析父级的解析承诺之前执行的。这怎么可能

在这里:


如果导航到
/route1/list
将立即显示警报,而不是等待5秒直到父级解决承诺得到解决。

因此,实际情况是,由于您没有将“父级”注入已解决的子级路由,因此它不会在尝试解决子级之前等待父级。如果您尝试以下方法:

resolve: {
  child: function(parent) {
    alert("Child Resolved!");
  }
}
然后在父级超时(resolve)后调用子级的resolved

我相信doc的意思是,它将等待所有问题得到解决,然后再执行到状态的实际转换,例如加载控制器和呈现模板

在下面的plunker中(我主要是从一个古老的scotch.io示例中借用的),我在依赖项之间移动。如果子解析依赖于父解析,则父承诺在子解析之前解析。如果子级不依赖,则子级首先解析(即使超时长度设置为0)

但是,在所有情况下,都不会输入父控制器和子控制器,并且在同时解析子控制器和父控制器之前不会渲染视图


保证在实际执行转换之前解决所有解析。但是这些语句没有指出解析函数将被同步调用。这是正确的

根据ui路由器,电缆尽可能“并行”解决。只有依赖于其他Invocales(来自父级或来自当前状态声明)的Invocales才会在其依赖关系解决后执行

因此,在解析
parent
后,使
child
可调用的唯一方法是将
parent
指定为
child
可调用的依赖项

.state("route1",{
   //..
   resolve: {
        parent: ["$timeout", "$q", function ($timeout, $q) {
            var d = $q.defer();
            $timeout(function () {
                d.resolve();
            }, 5000);
            return d.promise;
        }]
    }
 })
 .state("route1.list",{
    //...
    resolve: {
         child: ["parent", function(parent) {
             //will be called only after parent is resolved
         }]
 })
摘自GitHub源代码注释:

一旦所有依赖项都可用,就会立即调用Invocales。 即使是从调用
$resolve
父级继承的依赖项也是如此


如果你展示一些代码来重现你所描述的行为,这个问题可能会更容易回答。将其添加到plunker或其他东西中的功能相当大,我只是想确认我对引号的理解是正确的,是吗?之前执行的父级解析,你可能想展示一些代码:)。第二个引号仅表示路由器状态将在解析成功后更改。@gilly3-添加example@Eloims-添加了一个示例谢谢,您的假设我相信doc的意思是,它将等待所有问题得到解决,然后再执行到状态的实际转换,例如加载控制器和呈现模板。这就是医生说的。我想在接受回答之前我应该再等一会儿,也许有人会出现,谁知道呢。我对你的答案投了赞成票。这是一个很好的答案。请注意,在ui路由器1.0中,解析将有3个策略选项:“渴望”(与当前解析行为类似)、“懒惰”和“JIT”。惰性解析是在进入声明它们的状态之前调用的(这是提问者假设的行为)。JIT解析只有在其他东西注入它们时才会被调用。
.state("route1",{
   //..
   resolve: {
        parent: ["$timeout", "$q", function ($timeout, $q) {
            var d = $q.defer();
            $timeout(function () {
                d.resolve();
            }, 5000);
            return d.promise;
        }]
    }
 })
 .state("route1.list",{
    //...
    resolve: {
         child: ["parent", function(parent) {
             //will be called only after parent is resolved
         }]
 })