你可以通过异步执行某些种类的处理来使 UI 更具响应性,从而使应用的 UI 线程自由响应用户输入。本快速入门展示如何在 Windows 应用商店应用中执行异步编程。
适用于 JavaScript 的 Windows 库中和 Windows 运行时中的异步 API 在 JavaScript 中以承诺形式表示,承诺是在常见 JS Promises/A 提议中定义的。你可以在 JavaScript 中的异步编程中找到有关异步编程和承诺的详细信息。
当你使用承诺时,你可以添加一些错误处理使你的代码更加可靠。本快速入门仅显示可用于处理错误的多种方法之一,但是你可以在如何使用 JavaScript 中的承诺处理错误中了解更多内容。
先决条件
要完成本快速入门,你需要能够创建一个使用 Windows JavaScript 库的基本 Windows 应用商店应用。有关创建第一个应用的帮助,请参阅创建第一个采用 JavaScript 的 Windows 应用商店应用。
说明
1. 使用返回承诺的函数
让我们看一个简单的承诺示例。 我们将创建一个应用,该应用使用一个 URL 并尝试与该站点联系,然后报告联系是否成功。
-
创建一个名为 TestPromise 的空白 Windows 应用商店应用。
-
添加一个 INPUT 元素。
<</span>div> <</span>input id="inUrl" /> </</span>div>
-
添加一个显示该 URL 的结果的 DIV 元素。
<</span>div id="divResult">Result</</span>div>
-
为 INPUT 元素添加一个更改处理程序。可以作为 WinJS.Utilities.ready 函数的一部分执行此操作。它在 DOMContentLoaded 事件之后被立即调用,而该事件在解析页面之后,但在加载所有资源之前触发。
WinJS.Utilities.ready(function () {
var input = document.getElementByIdx_x("inUrl"); input.addEventListener("change", changeHandler);
}, false);
-
在更改处理程序中调用 xhr,同时向其传递用户输入的 URL,并使用结果更新结果 DIV。xhr 函数返回 Promise,因此我们可以使用承诺的 then 或 done 函数来更新 UI。只要 xhr 函数成功发出 XmlHttpRequest 或已获取错误,就会执行 then 方法。done 函数相同,但保证其引发该函数内未处理的任何错误除外。
你最多可以向 then 或 done 提供三个参数:一个是在承诺得到履行且没有错误后处理该承诺的completed 函数;一个是处理错误的 error 函数;一个是显示承诺完成进度的 progress 函数。现在,我们将仅说明如何添加 completed 函数,并且为另外的步骤保存错误处理。completed 函数将 result DIV 的背景色设为绿色,并且将文本设置为“Success”。
function changeHandler(e) {
var input = e.target;
var resDiv = document.getElementByIdx_x("divResult");
WinJS.xhr(
{ url: e.target.value }).then(
function completed(result) {
if (result.status === 200) {
resDiv.style.backgroundColor = "lightGreen";
resDiv.innerText = "Success";
}
});
}
-
生成并调试该应用,然后输入一个 URL。(当你输入 URL 后,你可能需要在 INPUT 控件外单击,以便更改事件出现。)如果 URL 有效,则 result DIV 应该变为绿色并显示“Success”。如果输入的 URL 无效,则不会发生任何事情。
2. 处理错误
-
要进行错误处理,请在 then 函数内部添加一个 error 函数,以便将 Success 按钮的背景色设置为红色,并且将文本设置为错误消息(如果有)。
function changeHandler(e) {
var input = e.target;
var resDiv = document.getElementByIdx_x("divResult");
WinJS.xhr({url: e.target.value}).then(
function fulfilled (result) {
if (result.status === 200) {
resDiv.style.backgroundColor = "lightGreen";
resDiv.innerText = "Success";
}
},
function error(e) {
resDiv.style.backgroundColor = "red";
if (e.message != undefined) { // If the URL is really malformed or blank. resDiv.innerText = e.message;
} else if (e.statusText != undefined) { // If an XmlHttpRequest is made. resDiv.innerText = e.statusText; }
else {
resDiv.innerText = "Error";
}
});
}
-
生成并调试该应用。如果输入的 URL 无效,按钮将变为红色并显示错误消息。
摘要 和 next steps
在本快速入门中,你了解了如何使用返回承诺的函数以及如何执行一种错误处理。
下面的主题就更复杂的承诺方案进行了说明: