JS Promise - 立即从返回Promise的函数中检索一些数据

Jam*_*e G 9 javascript ajax function promise

任何人都可以推荐一种模式,以便立即从返回Promise的函数中检索数据吗?

我的(简化)示例是一个AJAX预加载器:

loadPage("index.html").then(displayPage);
Run Code Online (Sandbox Code Playgroud)

如果这是下载一个大页面,我希望能够检查发生了什么,并可能在稍后阶段使用XHR abort()取消该过程.

我用过的loadPage函数(在Promises之前)返回一个id,让我稍后再这样做:

var loadPageId = loadPage("index.html",displayPage);
...
doSomething(loadPageId);
cancelLoadPage(loadPageId);
Run Code Online (Sandbox Code Playgroud)

在我的基于Promise的新版本中,我认为cancelLoadPage()会拒绝()原始的loadPage()Promise.

我考虑了一些我不喜欢的选项.是否有一种普遍接受的方法来实现这一目标?

Ham*_*pus 1

出色地。如果使用 Angular ,如果您需要取消正在进行的 HTTP 请求,则可以使用服务timeout使用的参数。$http

打字稿中的示例:

interface ReturnObject {
  cancelPromise: ng.IPromise;
  httpPromise: ng.IHttpPromise;
}

@Service("moduleName", "aService")
class AService() {

  constructor(private $http: ng.IHttpService
              private $q: ng.IQService) { ; }

  doSomethingAsynch(): ReturnObject {
    var cancelPromise = this.$q.defer();
    var httpPromise = this.$http.get("/blah", { timeout: cancelPromise.promise });
    return { cancelPromise: cancelPromise, httpPromise: httpPromise };
  }
}

@Controller("moduleName", "aController")
class AController {

  constructor(aService: AService) {
    var o = aService.doSomethingAsynch();

    var timeout = setTimeout(() => {
      o.cancelPromise.resolve();
    }, 30 * 1000);

    o.httpPromise.then((response) => {
      clearTimeout(timeout);
      // do code
    }, (errorResponse) => {
      // do code
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

由于此方法已经返回一个带有两个 Promise 的对象,因此将任何同步操作返回数据包含在该对象中并不遥远。

如果您可以描述您希望从此类方法同步返回什么类型的数据,这将有助于识别模式。为什么它不能是在异步操作之前或期间调用的另一个方法?