Aurelia JS - 发出同步 HTTP 请求,在页面加载前更改数据? [英] Aurelia JS - Making a synchronous HTTP request, to change data before page load?

查看:27
本文介绍了Aurelia JS - 发出同步 HTTP 请求,在页面加载前更改数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用联系人列表教程:

... 我想改变它,所以应用程序首先从点击我"按钮开始.单击此按钮后,应发出 Web 请求,该请求应返回 JSON 联系人数据.如果请求成功,响应应该更新联系人的主数据存储,页面应该开始呈现新的联系人列表;如果请求失败,页面应显示原始(硬编码)联系人列表.

可以在 https://gist.run/?id= 上找到原始联系人列表应用的副本c73b047c8184c052b4c61c69febb33d8(目前仅适用于 Chrome);而我为实现上述所做的更改在:

这是我尝试做的 - 首先,开始按钮有变化(也在 ​​Aurelia JS - 无法通过单击导航路由父级(未找到路由)?).* 然后,在 web-api.js 中有一个新的 setContactList 函数,它应该允许更改数据容器变量.* 点击开始点击我"按钮后,加载app-clist.*.在 app-clist.js 中,有构建新联系人列表的 PHP 代码,由于我没有简单的方法上传和运行服务器 PHP 代码,我将该 PHP 代码发送到 http://phpfiddle.org 处理它并返回结果(另见 https://softwarerecs.stackexchange.com/questions/39075/web-service-for-sharing-and-serving-php-code/39078#39078) 这是在 constructor() 函数中完成的,所以这是 app-clist.js 中的第一次对象代码> 加载(这是在单击开始按钮之后).如果此网络调用成功,则调用 setContactList 以更改联系人列表.

所以,问题来了 - 网络调用都成功了,但它们发生得太晚了 - 在页面呈现之后.单击开始按钮后,首先呈现页面(带有旧联系人);然后我收到警报:

gist.host 上的一个嵌入页面说:{"result":"[{"id":"1","firstName":"Bob","lastName":"Glass","email":"bob@glass.com","phoneNumber":"243-6593"},{"id":"2","firstName":"Chad","lastName":"Connor","email":"chad@connor.com","phoneNumber":"839-2946"}]"}

...这意味着网络调用成功,然后是第二个警报:

gist.host 上的一个嵌入页面说:设置联系人列表 2 2

... 说明接收到的contacts数组的长度和原来的一样,说明发生了更新.只是,它发生的太晚了.

这让我想起 JavaScript 中的 HTTP 调用往往是异步的 - 即它们只会启动进程,并且在它们完成之前不会阻塞其余的代码.我使用的 aurelia-http-client 可能就是这种情况:

this.http.createRequest('https://phpfiddle.org/api/run/code/json').asPost().withHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8').withContent("code="+encphpcode).发送().then(响应 => {警报(响应.响应);控制台日志(响应);var respobj = JSON.parse(response.response);var respdataArr = JSON.parse(respobj.result);this.api.setContactList(respdataArr);}).catch(err => {控制台日志(错误);});

所以对于我的概念 - 我在页面生命周期开始时调用服务,该服务返回应该在第一次显示时呈现在页面上的数据 - 我必须有一个同步调用,这会阻塞 app-clist 中的 constructor() 的执行,直到它完成(成功或失败),以便在页面渲染开始之前更新数据...

所以我的问题是:如何使用 Aurelia JS 进行同步 HTTP 调用?或者,是否可以使用异步调用来实现类似于我在此处的示例,如果可以,如何实现?

以下是一些更相关的文件供参考:

app-clist.html