Promises如何在JavaScript中运行?

M.K*_*afi 22 javascript asynchronous

我刚刚实现了我的第一个函数,该函数返回基于AngularJS中另一个promise的promise,并且它有效.但在此之前,我决定做到这一点,我花了2小时来阅读,并试图了解背后的承诺的概念.我想如果我能编写一段模拟承诺如何工作的简单代码,那么我就能够在概念上理解它,而不是在不知道它是如何工作的情况下使用它.我无法编写该代码.

那么,有人可以用vanilla JavaScript来说明承诺是如何运作的吗?

Guf*_*ffa 34

承诺基本上是一个有两种方法的对象.一种方法是定义要做什么,一种是告诉何时做.必须能够以任何顺序调用这两个方法,因此对象需要跟踪已调用的方法:

var promise = {
  isDone: false,
  doneHandler: null,
  done: function(f) {
    if (this.isDone) {
        f();
    } else {
        this.doneHandler = f;
    }
  },
  callDone: function() {
    if (this.doneHandler != null) {
        this.doneHandler();
    } else {
        this.isDone = true;
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

您可以先定义操作,然后触发它:

promise.done(function(){ alert('done'); });
promise.callDone();
Run Code Online (Sandbox Code Playgroud)

您可以先触发操作,然后定义它:

promise.callDone();
promise.done(function(){ alert('done'); });
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/EvN9P/

在异步函数中使用promise时,该函数会创建空的promise,保留对它的引用,并返回引用.处理异步响应的代码将触发promise中的操作,调用异步函数的代码将定义操作.

由于其中任何一个都可以按任何顺序发生,因此调用异步函数的代码可以挂起promise并在任何时候定义动作.