理解一些承诺代码和打字稿



我有以下代码,由于我没有经常使用Promises,所以我试图理解,这个问题更多的是关于理解代码的简单方法,而不是关于特定问题:

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);
});
}
  1. 在 get request 方法上,请求方法被执行,但有 2 个参数,但签名接收更多,它如何知道哪些参数? 按参数顺序?,它不需要传递所有参数吗?

  2. 什么是决心和拒绝?

  3. 我理解在 Web 请求执行后执行的代码,但是在 然后我根本没有看到函数,我看到数据:{ FormDigestValue: string }):void =>这是我不明白的语法。

  4. 什么是解析(this.response as T); ?我来自 C# 和泛型,所以看起来它可以返回任何东西?

  5. 最后,我可以在拒收件上放任何东西吗?

拒绝({ message: this.response['odata.error'].message.value, statusText: this.statusText, 状态:此状态 });

你发布的代码很难看,一点也不实用。这不是开始学习承诺的好地方。

一个非常好的起点是MDN(Mozilla Dev Network)。它有关于Javascript主题的优秀文档,包括Promise。

一些快速答案:

  1. request方法采用 2 个必需参数,其余参数是可选的,例如headers: any = null。这意味着如果headers(类型any)没有作为参数给出,它将默认为null

  2. 这两个函数都返回一个Promise对象,该对象表示将来的值或错误。resolve(value)用于表示Promise已成功成为值,reject(error)用于表示出现问题。

  3. 代码在请求后执行,因为它在从request返回的Promise上调用.then(onValue, onError)。为处理Promise的 2 种可能情况而传递的函数作为参数给出:

    (data: { FormDigestValue: string }): void => { resolve(data.FormDigestValue) }
    (error: any): void => { reject(error) }
    

如果从request返回的Promiseresolve(data)解决,这个函数将依次将自己的Promise解析为data.FormDigestValue

如果从request返回的Promisereject(error)解决,这个函数将反过来拒绝它自己的Promise相同的error

getRequestDigest不是很好的代码。正如您将通过阅读 MDN 文档了解到的那样,Promise对象都可以链接。new Promise()构造函数更难使用,在这种情况下不是必需的。它应该读成类似的东西(在这里跳过打字稿):

return component.request(url, method)
.then(data => data.FormDigestValue)

.then将产生一个新的Promise,从前一个(由component.request返回)派生,以创建相同的结果。

我有没有提到阅读MDN上的话题?说真的,很棒的资源。

最新更新