请参阅以下代码行:
WinJS.xhr({ url: "http://someurl.com" }).then(
function fulfilled(result)
{
if (result.status === 200)
{
resDiv.style.backgroundColor = "lightGreen";
resDiv.innerText = "Success";
}
});
据我所知,当WinJS.xhr完成它所做的任何事情然后执行带有参数'result'的匿名函数'履行'
来自Java / C ++背景,我对此代码的工作方式非常困惑 - 如何将“结果”传递给此函数?它在哪里说“结果”是什么?我如何知道对象“结果”的类型以及它如何具有“状态”成员?
答案 0 :(得分:3)
我将把我的答案分为两部分:第一部分涉及Javascript的实际执行模型,第二部分涉及写入的高级表达式。
WinJS
评估对象。xhr
成员WinJS.xhr
进行评估。该成员是一个函数,我们将在下面将其称为A
,以便我们可以清楚地知道究竟发生了什么。{ url: "http://someurl.com" }
会返回一个我们称之为B
的对象。B
有一个名为url
的属性。A(B)
调用函数A
,其值为B
作为参数。它返回一个我们将称为C
。C
有一个原型,其中包含一个名为then
的成员。 C.then
恰好评估函数。该功能我们将称为D
。function fulfilled(result) {...}
会返回一个我们称之为E
的函数。它也可以称为fulfilled
,但该程序片段中未使用该事实。 D(E)
调用函数D
,其值为E
作为参数。返回值没有任何效果。这里有三个功能;一个是回调(称为fulfilled
),另外两个可以称为“方法” - xhr
全局对象的一个WinJS
和promise对象的then
WinJS.xhr({ url: "http://someurl.com" })
创建并返回promise object。您可以通过咨询the documentation来说服自己。
promise对象有一个名为then
的方法,它记录了你可以想到的作为事件处理程序的时间完成 。在result
中注册的回调中使用的值then
来自于通过在该承诺上调用方法done
而使完成承诺的任何内容。您没有看到执行此操作的代码,因为它位于WinJS.xhr
的实现中。
WinJS.xhr
正在执行的是执行网络请求。当该网络请求完成时,它将通过调用done()
方法通过promise发出该网络请求的结果(根据文档是XMLHttpRequest对象)。那个承诺。这反过来调用我们使用then()
方法注册的回调。
答案 1 :(得分:1)
xhr
method返回Promise
object,其中then
method带有onComplete
,onError
和onProcress
回调函数。
此代码仅使用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
method来处理结果。
我在文档中没有找到任何指定服务器值的确切形式的内容。它可能存在于某个地方,但与Microsoft文档一样,它相当完整,但并不是所有地方都是如此,所以你必须在不同的地方寻找特定的信息。
答案 2 :(得分:1)
WinJS功能的文档仍然不是很好,IMO。您可以在http://msdn.microsoft.com/en-us/library/windows/apps/br229787.aspx查看WinJS.xhr
的文档,这将为您提供一些相关信息 - 它表示xhr
函数“在承诺中包装... XMLHttpRequest对象” 。就个人而言,我发现更容易查看示例/快速入门,而不是参考文档。
您传递给fulfilled
函数(或其中的第一个函数)的不是操作的“结果”,而是XMLHttpRequest
对象本身。在那你可以得到它的属性来查看结果 - 看看http://msdn.microsoft.com/en-us/library/windows/apps/ms535874.aspx作为参考。