如何在继续之前等待异步回调方法



我有以下2种方法。

但是,在我从HTTP模块中覆盖的get方法中,身份验证成功回调是在已执行请求并返回响应后调用的。这样添加了 jwt令牌以错误的顺序向标题,为时已晚。

我对承诺和可观察到的知识并不多。

authenticate(authCompletedCallback, errorCallback) {
  let authContext = new Microsoft.ADAL.AuthenticationContext(AUTHORITY_URL);
  authContext.tokenCache.readItems().then((items) => {
    if (items.length > 0) {
        AUTHORITY_URL = items[0].authority;
        authContext = new Microsoft.ADAL.AuthenticationContext(AUTHORITY_URL);
    }
    // Attempt to authorize user silently.
    authContext
      .acquireTokenSilentAsync(RESOURCE_URL, CLIENT_ID)
      .then(authCompletedCallback, () => {
          // We require user credentials so trigger authentication dialog.
          authContext
            .acquireTokenAsync(RESOURCE_URL, CLIENT_ID, REDIRECT_URL)
            .then(authCompletedCallback, errorCallback);
      });
  });
}
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
  this.authenticate((authResponse) => {
    // This is executed second.
    if (!options) {
      options = { headers: new Headers() };
    }
    options.headers.set('Authorization', 'Bearer ' + authResponse.accessToken);
  }, (err) => {
    alert(JSON.stringify(err));
  });
  // This is executed first.
  return super.get(url, options);
}

您可能需要使get函数返回诺言,因为直到您进行身份验证后,实际响应对象不应该存在。不过,看来您正在覆盖一种方法,所以也许您需要做一个不同的方法。

getWithAuthentication(url: string, options?: RequestOptionsArgs): Promise<Observable<Response>> {
 return new Promise((resolve, reject) => {
  this.authenticate((authResponse) => {
    if (!options) {
      options = { headers: new Headers() };
    }
    options.headers.set('Authorization', 'Bearer ' + authResponse.accessToken);
    let response = super.get(url, options);
    resolve(response);
  }, (err) => {
    alert(JSON.stringify(err));
    reject(err);
  });
 }
}

最新更新