承诺在JavaScript中是如何工作的?

承诺在JavaScript中是如何工作的?,javascript,asynchronous,Javascript,Asynchronous,我刚刚实现了我的第一个函数,该函数基于AngularJS中的另一个承诺返回一个承诺,它成功了。但在我决定这么做之前,我花了两个小时阅读并试图理解承诺背后的概念。我想如果我能写一段简单的代码来模拟承诺是如何工作的,那么我就能够从概念上理解它,而不是在不知道它是如何工作的情况下使用它。我不会写那个代码 那么,有人能用普通JavaScript说明承诺是如何工作的吗?承诺基本上是一个有两种方法的对象。一种方法是定义要做什么,一种是告诉什么时候做。必须能够以任意顺序调用这两个方法,因此对象需要跟踪调用了哪

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


那么,有人能用普通JavaScript说明承诺是如何工作的吗?

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

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;
    }
  }
};
您可以先定义操作,然后触发它:

promise.done(function(){ alert('done'); });
promise.callDone();
您可以先触发操作,然后定义它:

promise.callDone();
promise.done(function(){ alert('done'); });
演示:

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


由于这两种情况都可以按任意顺序发生,因此调用异步函数的代码可以保留承诺,并在需要时随时定义操作。

为了简单地理解Javascript中的承诺。 您可以参考下面的示例。只需将粘贴复制到新的php/html文件中并运行

<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">

function test(n){
    alert('input:'+n);

    var promise = new Promise(function(fulfill, reject) {         
      /*put your condition here */
      if(n) {
        fulfill("Inside If! match found");
      }
      else {
        reject(Error("It broke"));
      }
    });
    promise.then(function(result) {
      alert(result); // "Inside If! match found"
    }, function(err) {
      alert(err); // Error: "It broke"
    });
}

</script>

</head>
<body>
<input type="button" onclick="test(1);" value="Test"/>

</body>
</html>

功能测试(n){
警报('输入:'+n);
var promise=新承诺(函数(履行、拒绝){
/*把你的情况写在这里*/
如果(n){
完成(“内部如果!找到匹配项”);
}
否则{
拒绝(错误(“它坏了”);
}
});
承诺。然后(功能(结果){
警报(结果);//“如果内部找到匹配项”
},函数(err){
警报(错误);//错误:“它坏了”
});
}
  • 单击测试按钮
  • 它将创造新的希望
  • 如果条件为真,它将实现响应
  • 在这之后,承诺。然后调用,并根据履行情况打印结果
  • 如果拒绝承诺,则返回错误消息

  • 承诺用法的最简单示例可能如下所示:

    var method1 = (addings = '') => {
      return new Promise(resolve => {
        console.log('method1' + addings)
        resolve(addings + '_adding1');
      });
    }
    var method2 = (addings = '') => {
      return new Promise(resolve => {
        console.log('method2' + addings)
        resolve(addings + '_adding2');
      });
    }
    
    method1().then(method2).then(method1).then(method2);
    // result:
    // method1            
    // method2_adding1    
    // method1_adding1_adding2
    // method2_adding1_adding2_adding1
    
    这是最基本的。有了它,您可以尝试拒绝:

    var method1 = (addings = '*') => {
      return new Promise((resolve, reject) => {
        console.log('method1' + addings)
        resolve(addings + '_adding1');
      });
    }
    var method2 = (addings = '*') => {
      return new Promise((resolve, reject) => {
        console.log('method2' + addings)
        reject();
      });
    }
    var errorMethod = () => {
      console.log('errorMethod')
    }
    method1()
    .then(method2, errorMethod)
    .then(method1, errorMethod)
    .then(method2, errorMethod)
    .then(method1, errorMethod)
    .then(method2, errorMethod);
    // result:
    // method1*           
    // method2*_adding1
    // errorMethod
    // method2*
    // errorMethod
    // method2*
    
    正如我们所看到的,在失败的情况下,错误函数被激发(这总是
    然后
    的第二个参数),然后链中的下一个函数在没有给定参数的情况下被激发

    为了获得更高的知识,我邀请你

    请检查这个简单的承诺代码。这将帮助您更好地理解promise功能

    承诺是一个可能在未来某个时间产生单一价值的对象:要么是已解决的价值,要么是未解决的原因。承诺可能处于三种状态之一:履行、拒绝或未决。承诺用户可以附加回调来处理满足的值或拒绝的原因

    let myPromise=新承诺((解决、拒绝)=>{
    如果(2==2){
    解决(“已解决”)
    }否则{
    拒绝(“拒绝”)
    }
    });
    我的承诺。然后((消息)=>{
    write(`promise是${message}`)
    }).catch((消息)=>{
    write(`promise是${message}`)
    
    })
    只是为了澄清您的期望。。。承诺是您实现的东西,而不是普通JavaScript中的语言构造。看看这个:这个问题没有理由因为太宽泛而被关闭。这是一个非常明确和具体的问题。我认为这个答案可以改进。