javascript - Angular JS中的异步调用问题
问题描述
在我的角度应用程序中,在下面的场景中,我遇到了一个问题。
共有三个文件
mainCtrl.js
在应用程序加载时,init()
将触发 mainCtl.js,它将像这样调用 flowService
flowService.configureSteps();
它将调用 flowService 并进行服务器调用以获取数据。
流服务.js
function configureSteps() {
salesService.getSalesOrder().then(function(response) {
salesService.setSalesOrder(response);
});
}
这会将 保存salesOrder
到要在subCntrl
subCtrl.js
在 subCntrl 的初始化中,我试图获取我保存在服务中的 salesOrder。
function init() {
salesService.getSalesOrder();
}
问题
当我像这样点击网址时
http://www.myapp.com/review#/subpage
- 它会打到 mainCtrl
- 从那里它将调用服务并进行服务器调用
- 由于它是异步的,它将被重定向到 subCntrl
- 它将尝试检索尚未从服务器接收到的 salesOrder。
这怎么能做到同步。?
解决方案
您可以将mainCtrl.js flowService.configureSteps()
调用移至:
使用 UI-Router 状态,您可以设置将在访问引用状态之前执行的解析函数,从而可以在该状态的控制器实例化之前执行同步操作。
在您的情况下,您可以flowService.configureSteps()
在访问 mainCtrl 之前执行您的操作,并salesService.getSalesOrder()
在访问subCtrl之前执行此操作(但肯定是在上一个订单保存之后)。
使用 ngRoute,您可以将routeChange 回调定义为:
$rootScope.$on("$routeChangeStart", function (event, currentRoute, previousRoute) {
//
});
在此回调中,您可以在路由激活之前执行您的逻辑,确保在您点击页面时获得所需的内容。
如果您需要进一步的帮助,请分享您的路线/状态配置。
推荐阅读
- scala - Spark DF 在 witcolumn 中创建 Seq 列
- html - 粘性标题 z-index 低于覆盖 z-index 但仍出现在前面
- php - 将 CSS 类作为 PHP if else 语句的一部分
- mongodb - 使用 Gitlab 通过 Helm 创建 MongoDB 失败
- android - 在 Android 设备上复制没有“playsinline”视频属性?
- ruby - 替换与特定正则表达式不匹配的字符
- python - 运行pytorch时如何加载cuda?
- node.js - 处理每条 Express 路线上的异常情况
- javascript - 一旦所有字段都输入正确,如何使用 javascript 启用“创建帐户”按钮?
- python - 在 Sqlalchemy 中查询格式不正确以进行选择