Promise then中回调为什么是异步执行?Promise执行机制问题

今天发现一个问题,看下方代码

 let p = new Promise(function(resolve, reject) {
    resolve(1)
    console.log(‘2222‘);
 });
p.then(res => {
    console.log(‘1111‘);
})

输出结果是2222 1111,而自己想的是1111 2222,带着问题查询之后发现.

原来then后边跟的都是异步执行..学习到了.

此链接是各位大佬的回答https://www.zhihu.com/question/57071244

用网上学习ES5实现的Promise ,输出结果和自己想的一样,原因可以去上方地址找到.

下方是ES5实现的promise

function Promise(callback) {
  var self = this;
  self.status = ‘PENDING‘; // Promise当前的状态
  self.data = undefined; // Promise的值
  self.onResolvedCallback = []; // Promise resolve时的回调函数集
  self.onRejectedCallback = []; // Promise reject时的回调函数集
  callback(resolve, reject); // 执行executor并传入相应的参数

  function resolve(value) {
    if (self.status == ‘PENDING‘) {
      self.status == ‘FULFILLED‘;
      self.data = value;
      // 依次执行成功之后的函数栈
      for (var i = 0; i < self.onResolvedCallback.length; i++) {
        self.onResolvedCallback[i](value);
      }
    }
  }

  function reject(error) {
    if (self.status === ‘PENDING‘) {
      self.status = ‘REJECTED‘;
      self.data = error;
      // 依次执行失败之后的函数栈
      for (var i = 0; i < self.onRejectedCallback.length; i++) {
        self.onRejectedCallback[i](error);
      }
    }
  }
}

Promise.prototype.then = function(onResolved, onRejected) {
  var self = this;
  var promise2;

  // 根据标准,如果then的参数不是function,则我们需要忽略它,此处以如下方式处理
  onResolved = typeof onResolved === ‘function‘ ? onResolved : function(value) {};
  onRejected = typeof onRejected === ‘function‘ ? onRejected : function(reason) {};

  if (self.status === ‘FULFILLED‘) {
    // 如果promise1(此处即为this/self)的状态已经确定并且是resolved,我们调用onResolved
    // 因为考虑到有可能throw,所以我们将其包在try/catch块里
    return (promise2 = new Promise(function(resolve, reject) {
      try {
        var x = onResolved(self.data);
        if (x instanceof Promise) {
          // 如果onResolved的返回值是一个Promise对象,直接取它的结果做为promise2的结果
          x.then(resolve, reject);
        }
        resolve(x); // 否则,以它的返回值做为promise2的结果
      } catch (e) {
        reject(e); // 如果出错,以捕获到的错误做为promise2的结果
      }
    }));
  }

  // 此处与前一个if块的逻辑几乎相同,区别在于所调用的是onRejected函数,就不再做过多解释
  if (self.status === ‘REJECTED‘) {
    return (promise2 = new Promise(function(resolve, reject) {
      try {
        var x = onRejected(self.data);
        if (x instanceof Promise) {
          x.then(resolve, reject);
        }
      } catch (e) {
        reject(e);
      }
    }));
  }

  if (self.status === ‘PENDING‘) {
    // 如果当前的Promise还处于pending状态,我们并不能确定调用onResolved还是onRejected,
    // 只能等到Promise的状态确定后,才能确实如何处理。
    // 所以我们需要把我们的**两种情况**的处理逻辑做为callback放入promise1(此处即this/self)的回调数组里
    // 逻辑本身跟第一个if块内的几乎一致,此处不做过多解释
    return (promise2 = new Promise(function(resolve, reject) {
      self.onResolvedCallback.push(function(value) {
        try {
          var x = onResolved(self.data);
          if (x instanceof Promise) {
            x.then(resolve, reject);
          }
          resolve(x); // 否则,以它的返回值做为promise2的结果
        } catch (e) {
          reject(e);
        }
      });

      self.onRejectedCallback.push(function(reason) {
        try {
          var x = onRejected(self.data);
          if (x instanceof Promise) {
            x.then(resolve, reject);
          }
        } catch (e) {
          reject(e);
        }
      });
    }));
  }
};

// 为了下文方便,我们顺便实现一个catch方法
Promise.prototype.catch = function(onRejected) {
  return this.then(null, onRejected);
};

  

原文地址:https://www.cnblogs.com/chengfeng6/p/10823064.html

时间: 2024-11-04 19:53:23

Promise then中回调为什么是异步执行?Promise执行机制问题的相关文章

when 让你跳出异步回调噩梦 node.js下promise/A规范的使用

其实关于promise 的博客,前端时间专门写了一篇关于 promise 规范的文章,promise规范 让 javascript 中的异步调用更加人性化. 简单回忆下: promise/A规范定义的“Deferred/Promise”模型 其实是实现了“发布/订阅”模型. 通过Deferred对象发布事件, 包括下面2种事件 完成 --> resolve事件, 失败 --> reject事件, 通过Promise对象进行对应完成或失败的订阅 类似于任务状态转变时事件被触发. 将会对应的执行事

js执行顺序/Promise优雅解决回调函数嵌套

先执行同步 然后把settimeout(function xx(){}放进堆栈 然后执行回调 function xx() /** * Created by Administrator on 2016/10/28. */ // nodejs 封装操作文件的功能 fs var fs = require('fs'); //同步读取 // var str = '' // str += fs.readFileSync('./data/01','utf-8'); // str += fs.readFileS

javaScript中的同步,异步与回调函数

for (var i = 0; i < 5; i++) { setTimeout(function() { console.log('i: ',i); }, 1000); } console.log(i); 输出结果: //输出 5 i: 5 i: 5 i: 5 i: 5 i: 5 记住我们的口诀,同步=>异步=>回调 1.for循环和循环体外部的console是同步的,所以先执行for循环,再执行外部的console.log.(同步优先) 2.for循环里面有一个setTimeout回

js中回调函数,promise 以及 async/await 的对比用法 对比!!!

在编程项目中,我们常需要用到回调的做法来实现部分功能,那么在js中我们有哪些方法来实现回调的? 方法1:回调函数 首先要定义这个函数,然后才能利用回调函数来调用! login: function (fn) { var app = getApp() wx.login({ success: res => { let code = res.code; wx.getSetting({ success: res => { if (res.authSetting['scope.userInfo']) {

【Mocha.js 101】同步、异步与 Promise

前情提要 在上一篇文章<[Mocha.js 101]Mocha 入门指南>中,我们提到了如何用 Mocha.js 进行前端自动化测试,并做了几个简单的例子来体验 Mocha.js 给我们带来的便利. 在本篇文章中,我们将了解到 Mocha.js 的同步/异步测试,以及如何测试 Promise. 同步代码测试 在上一篇文章中,其实我们已经学会了如何测试同步代码.今天,我们 BDD 风格编写一个测试: var should = require( 'should' ); var Calculator

ES6新特性:Javascript中内置的延迟对象Promise

Promise的基本使用: 利用Promise是解决JS异步执行时候回调函数嵌套回调函数的问题, 更简洁地控制函数执行流程: 通过new实例化Promise,  构造函数需要两个参数, 第一个参数为函数执行成功以后执行的函数resolve, 第二个函数为函数执行失败以后执行的函数reject: new Promise(function(resolve , reject) { }); 通过Promise,我们把回调函数用线性的方式写出来,而不是一层套一层, 这个函数有四层回调: fn("args&

简单实现异步编程promise模式

本篇文章主要介绍了异步编程promise模式的简单实现,并对每一步进行了分析,需要的朋友可以参考下 异步编程 javascript异步编程, web2.0时代比较热门的编程方式,我们平时码的时候也或多或少用到,最典型的就是异步ajax,发送异步请求,绑定回调函数,请求响应之后调用指定的 回调函数,没有阻塞其他代码的执行.还有像setTimeout方法同样也是异步执行回调的方法. 如果对异步编程还不太熟悉的话,直接戳 阮一峰大牛的教程 ,这篇文章介绍了四种异步编程的方式: 回调函数 事件监听 发布

【JavaScript进阶】深入理解JavaScript中ES6的Promise的作用并实现一个自己的Promise

1.Promise的基本使用 1 // 需求分析: 封装一个方法用于读取文件路径,返回文件内容 2 3 const fs = require('fs'); 4 const path = require('path'); 5 6 7 /** 8 * 把一个回调函数才分成两个回调函数 9 * @param filename 10 * @param successCallback 11 * @param errorCallback 12 */ 13 function getFileByPath(fil

C++中回调函数(CallBack)的使用

如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现成员函数可以访问C++的数据成员.这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员.由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败.要解决这一问题的关键就是不让t