理解一些Promises代码和打字稿

时间:2016-12-14 01:17:04

标签: javascript typescript promise

我有以下代码,因为我没有与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);
    });
  }
  1. 在get请求方法中,执行请求方法,但是有2个参数,但签名收到的更多,它如何知道哪些参数?通过参数顺序?,不需要传递所有参数吗?

  2. 什么是解决和拒绝?

  3. 我理解,然后在执行Web请求后执行代码,但是在那时我根本看不到函数,我看到数据:{FormDigestValue:string}):void =&gt;这是我不理解的语法。

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

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

  6. 拒绝({               message:this.response [&#39; odata.error&#39;]。message.value,               statusText:this.statusText,               状态:this.status             });

1 个答案:

答案 0 :(得分:3)

你发布的代码很难看,根本不实用。它不是一个开始学习承诺的好地方。

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

一些快速回答:

  1. request方法需要2个必需参数,其余参数是可选的,例如headers: any = null。这意味着,如果headers(类型any)未作为参数提供,则默认为null

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

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

    (data: { FormDigestValue: string }): void => { resolve(data.FormDigestValue) }
    (error: any): void => { reject(error) }
    
  4. 如果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上的主题?说真的,很有资源。