gpt4 book ai didi

javascript - 等待 AngularJS 或 Javascript(浏览器)中的异步数据

转载 作者:行者123 更新时间:2023-12-02 14:33:36 24 4
gpt4 key购买 nike

我正在用 AngularJS 为 Odoo Server 编写一个服务包装器,它具有服务器支持的所有方法,并在调用服务时返回延迟 promise 。例如:

$scope.runRPC = function(){
odooSvc.fields_get('res.users').then(
function(result){
console.log(result); //return a list of users
}
);
}

但是,我需要它是同步的,这是一个原因。

在 Odoo 中,它有自己的 JSON rpc API,其中有多个相互依赖的方法。

例如,

search_read:为您提供您查询的模型上所有内容的列表fields_get:给你模型拥有的字段列表还有更多。

通常在一个正在运行的应用程序中,我们需要调用2个或更多API方法来获取我们想要的最终数据。然而,因为在 Java 中,一切都是异步工作的。我想象的代码会嵌套且复杂。

因此,当我进行每个 API 调用时,它们都相互依赖。它看起来像这样:

$scope.setLoginToContactEmail = function(){
odooSvc.search_read('res.users').then(
function(users){
for(var i=0; i < user.length; i++){
user = users[0];
login = user.login
partner_id = user.partner_id

odooSvc.read_model('res.partner', partner_id).then(
function(partner){
if(login === partner.email){
odooSvc.write_model('res.partner', partner_id, {email: login}).then(function(msg){
console.log(msg);
});
}
}
)
}
}
);
}

对比我是否可以让这些 API 同步运行或等待数据到达,然后再继续另一个调用。它看起来会更简单:

$scope.setLoginToContactEmail = function(){
var users = odooSvc.search_read('res.users');
for(var i=0; i < user.length; i++){
user = users[0];
login = user.login
partner_id = user.partner_id

partner = odooSvc.read_model('res.partner', partner_id);
if (login === partner.email){
odooSvc.write_model('res.partner', partner_id, {email: login});
}
}
}

请指教。谢谢。

最佳答案

这里是a plunker负责 Babel 转译:

  <body ng-app="app" ng-controller="AsyncController">
<p>{{ message }}</p>
</body>
<小时/>
angular.module('app', []).controller('AsyncController', ['$timeout', '$scope', async function ($timeout, $scope) {
$scope.message = 'no timeout';

$scope.message = await $timeout(() => 'timeout', 2000);
$scope.$apply();
}]);

async...await 与 TypeScript 和 ES.next 中的一样简单。这里应该注意两件事。

第一个是异步 Controller 内的this上下文 - 它可能与预期不同。当使用类并且必要时绑定(bind)异步方法时,这可能不是问题。当构造函数是异步的并且无法从一开始就到达其 this 时,这对于非 OOP 代码来说是一个问题。

另一个是 async...await 由原生 Promises 提供支持。这意味着尽管已经使用了对摘要友好的 $timeout,但仍应调用 $scope.$apply() 来触发摘要周期。

关于javascript - 等待 AngularJS 或 Javascript(浏览器)中的异步数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37640867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com