1

请参见以下代码行:

WinJS.xhr({ url: "http://someurl.com" }).then(
          function fulfilled(result)
          {
             if (result.status === 200)
             {
                resDiv.style.backgroundColor = "lightGreen";
                resDiv.innerText = "Success";
             }
          });

据我了解,当 WinJS.xhr 完成它所做的一切,执行带有参数“result”的匿名函数“fulfilled”

来自 Java/C++ 背景,我对这段代码的工作方式感到非常困惑——“结果”是如何传递给这个函数的?它在哪里说明了什么是“结果”?我如何知道什么类型的对象“结果”以及它如何具有“状态”成员?

4

3 回答 3

3

我将把我的答案分成两部分:第一部分涉及 Javascript 的实际执行模型,第二部分涉及编写的高级表达式。

Javascript 执行模型

  1. WinJS评估为一个对象。
  2. 该对象有一个原型,其中包含一个评估为的xhr成员。WinJS.xhr该成员是一个函数,我们将在A下面对其进行引用,以便我们清楚到底发生了什么。
  3. 在我们开始之前,{ url: "http://someurl.com" }返回一个我们将称为 的对象B
  4. 该对象B有一个名为 的属性url
  5. A(B)A以值B作为参数调用函数。它返回一个我们将称为 的对象C
  6. 该对象C有一个原型,其中包含一个名为 的成员thenC.then碰巧评估为一个函数。该函数我们将称为D
  7. function fulfilled(result) {...}返回一个我们将称为 的函数E。它也可以被称为,fulfilled但在这个程序片段中没有使用这个事实。
  8. D(E)D以值E作为参数调用函数。没有对返回值做任何事情。

高层观点

这里有三个功能;一个是回调(称为fulfilled),另外两个可以称为“方法”——一个xhrWinJS全局对象,then一个是 promise 对象。

WinJS.xhr({ url: "http://someurl.com" })创建并返回该承诺对象您可以通过查阅文档来说服自己相信这一点。

Promise 对象有一个调用方法,该方法then注册您可以认为的事件处理程序,以便在 Promise完成时进行处理。result在注册的回调中使用的值then来自于通过实际上调用该承诺上的方法来完成done该承诺。您看不到执行此操作的代码,因为它位于WinJS.xhr.

正在做WinJS.xhr的是执行网络请求。当该网络请求完成时,它将通过调用该 Promise 上的方法通过该Promise发出该网络请求的结果(根据文档,它是一个XMLHttpRequestdone()对象) 。这反过来又调用了我们用该then()方法注册的回调。

于 2012-09-30T14:10:55.430 回答
1

xhr方法返回一个Promise对象,该对象具有采用,和回调函数的then方法。onCompleteonErroronProcress

此代码仅使用onComplete回调。请求完成时调用回调,并发送一个参数,其中包含从服务器发送的值。

如果你不熟悉回调函数,如果你声明一个常规函数用作回调可能会更清楚:

function fulfilled(result) {
  if (result.status === 200) {
    resDiv.style.backgroundColor = "lightGreen";
    resDiv.innerText = "Success";
  }
}

WinJS.xhr({ url: "http://someurl.com" }).then(fulfilled);

then方法旨在预处理结果,您应该使用该done方法来处理结果。

我没有在文档中找到任何确切指定值来自服务器的形式的任何内容。它可能在某个地方,但与 Microsoft 文档一样,它相当完整,但并非所有内容都无处不在,因此您必须在不同的地方查找特定信息。

于 2012-09-30T13:53:42.553 回答
1

IMO,WinJS 函数的文档仍然不是很好。您可以查看http://msdn.microsoft.com/en-us/library/windows/apps/br229787.aspxWinJS.xhr上的文档,这将为您提供一些相关信息 - 它说函数“wraps . .. 承诺中的 XMLHttpRequest 对象”。就个人而言,我发现查看示例/快速入门比查看参考文档更容易。xhr

您传递给fulfilled函数(或那里的第一个函数)的不是操作的“结果”,而是XMLHttpRequest对象本身。在那您可以获取它的属性以查看结果 - 请查看http://msdn.microsoft.com/en-us/library/windows/apps/ms535874.aspx以供参考。

于 2012-09-30T13:54:53.893 回答