我有以下代码,因为我没有与Promise合作过很多,然后我试图理解,这个问题更多的是关于理解代码而不是特定问题的简单方法:
private getRequestDigest(siteUrl: string): Promise<string> {
const component: Reactwithmsgraphandsharepoint = this;
return new Promise<string>((resolve, reject): void => {
component.request(`${siteUrl}/_api/contextinfo`, 'POST').then((data: { FormDigestValue: string }): void => {
resolve(data.FormDigestValue);
}, (error: any): void => {
reject(error);
});
});
}
private request<T>(url: string, method: string = 'GET', headers: any = null, data: any = null): Promise<T> {
return new Promise<T>((resolve, reject): void => {
const xhr: XMLHttpRequest = new XMLHttpRequest();
xhr.onreadystatechange = function (): void {
if (this.readyState === 4) {
if (this.status === 200) {
resolve(this.response as T);
}
else if (this.status >= 400) {
reject({
message: this.response['odata.error'].message.value,
statusText: this.statusText,
status: this.status
});
}
}
};
xhr.open(method, url, true);
if (headers === null) {
xhr.setRequestHeader('Accept', 'application/json;odata=nometadata');
}
else {
for (var header in headers) {
if (headers.hasOwnProperty(header)) {
xhr.setRequestHeader(header, headers[header]);
}
}
}
xhr.responseType = 'json';
xhr.send(data);
});
}
在get请求方法中,执行请求方法,但是有2个参数,但签名收到的更多,它如何知道哪些参数?通过参数顺序?,不需要传递所有参数吗?
什么是解决和拒绝?
我理解,然后在执行Web请求后执行代码,但是在那时我根本看不到函数,我看到数据:{FormDigestValue:string}):void =&gt;这是我不理解的语法。
什么是解决方案(this.response as T); ?我来自C#和泛型,所以看起来它可以返回任何东西?
最后,我可以把任何东西放在拒绝上吗?
拒绝({ message:this.response [&#39; odata.error&#39;]。message.value, statusText:this.statusText, 状态:this.status });
答案 0 :(得分:3)
你发布的代码很难看,根本不实用。它不是一个开始学习承诺的好地方。
非常好的起点是MDN(Mozilla Dev Network)。它有关于Javascript主题的优秀文档,包括Promise。
一些快速回答:
request
方法需要2个必需参数,其余参数是可选的,例如headers: any = null
。这意味着,如果headers
(类型any
)未作为参数提供,则默认为null
。
两个函数都返回一个Promise
对象,表示将来的值或错误。 resolve(value)
用于表示Promise
成功变为值,reject(error)
用于表示出现问题。
代码在请求后执行,因为它在.then(onValue, onError)
返回的Promise
上调用request
。传递给处理Promise
的两种可能情况的函数作为参数给出:
(data: { FormDigestValue: string }): void => { resolve(data.FormDigestValue) }
(error: any): void => { reject(error) }
如果Promise
返回的request
已由resolve(data)
结算,则此功能会依次将Promise
解析为data.FormDigestValue
。
如果Promise
的{{1}}返回由request
设置,则此功能将拒绝使用相同的reject(error)
自己的Promise
。
error
代码不是很好。通过阅读MDN文档,您可以学习getRequestDigest
个对象。 Promise
构造函数更难使用,在这种情况下不是必需的。它应该读取类似的东西(跳过这里的打字稿):
new Promise()
return component.request(url, method)
.then(data => data.FormDigestValue)
将生成一个新的.then
,派生自前一个Promise
返回)以创建相同的结果。
我是否曾提及阅读MDN上的主题?说真的,很有资源。