code

上一章中我们遇到了两个问题

1.异步调用顺序的问题

2.then返回一个promise的问题

思考

如果控制异步回调的顺序?

因为异步操的时间作我们无法控制,但是我们只需要按顺序执行回调函数就好了

也就是说

then里面的回调,我们等调用 resolve方法之后(确保异步操作完成),再来执行

操作

用一个变量nextResolve 来保存then的 回调函数

放在resolve之后调用

   function MyPromise(fn) {
var res = null,
       callback = null,
nextResolve = null;
function resolve(val) {
if(typeof(callback) === 'function'){
res = callback(val);
}
nextResolve(res);
} function reject(val){
if(typeof(callback) === 'function'){
res = callback(val);
}
nextResolve
} this.then = function (cb) {
callback = cb;
return new MyPromise(function(resolve,reject){
nextResolve = resolve;
})
}; fn(resolve,reject);
}

结果是

是我们要的结果。

现在到第二个问题

如果返回的是一个promise呢? 下面这种是我们的连续异步操作

   http('www.123.com').then(function(res){
console.log(res)
return http('www.456.com');
}).then(function(res){
console.log(res)
})

直接把 promise对象返回了,不是promise执行之后的值

这个时候我们要的是 www.456.com

也就是说我们要执行 then方法,才能得到 www.456.com

现在我们只要判断,如果是返回一个promise对象,我们就执行他的resolve方法 就能拿到它回调的值了。

注意 return

    function MyPromise(fn) {
var res = null,
       callback = null,
nextResolve = null;
function resolve(val) { if(typeof(callback) === 'function'){
res = callback(val);
}
if(res && res instanceof MyPromise){
var newThen = res.then
newThen.call(res,nextResolve);
return;
} if(typeof(nextResolve) === 'function'){
nextResolve(res);
}
} function reject(val){
if(typeof(callback) === 'function'){
res = callback(val);
}
nextResolve
} this.then = function (cb) {
callback = cb;
return new MyPromise(function(resolve,reject){
nextResolve = resolve;
})
}; fn(resolve,reject);
}

成功返回

下一章我们介绍 ,reject 和catch的写法

简易promise的实现(二)的更多相关文章

  1. 简易promise

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  2. 实现简易Promise

    概述 异步编程离不开promise, async, 事件响应这些东西,为了更好地异步编程,我打算探究一下promise的实现原理,方法是自己实现一个简易的promise. 根据promise mdn上 ...

  3. django 开发简易博客(二)

    这一节我们来了解模板和视图.URL的使用. 一.使用模板 在blog目录中新建templates文件夹,在templates文件夹下新建base.html文件.目录结构如下 templates/ ba ...

  4. 一步一步实现基于Task的Promise库(二)all和any方法的设计和实现

    在上一篇中我们已经初步完成了Task类,如果仅仅是这些,那么没有多大意义,因为网上这类js库有很多,现在我们来些更复杂的使用场景. 如果我们现在有这样一个需求:我们要先读取aa.txt的内容,然后去后 ...

  5. 简易promise的实现(一)

    code 最近在思考promise的实现原理 于是准备自己写一个简单的demo 一开始想到的问题有两个 1.链式调用 2.异步顺序执行 -------------------------------- ...

  6. 基于Java的简易表达式解析工具(二)

    之前简单的介绍了这个基于Java表达式解析工具,现在把代码分享给大家,希望帮助到有需要的人们,这个分享代码中依赖了一些其他的类,这些类大家可以根据自己的情况进行导入,无非就是写字符串处理工具类,日期处 ...

  7. C 实现一个简易的Http服务器 (二)

    正文 - 直接搞起 C 实现一个简易的Http服务器 很久以前写过一个简易的http服务器, 后面和一个朋友交流, 反思后发现问题不少.在这里简单搞一下. 让其更加简单去表现httpd本质, 弱化协议 ...

  8. deferred对象和promise对象(二)---deferred对象

    早上醒来,继续讨论deferred对象和primise对象. deferred对象的的方法: 1.$.Deferred()-----生成一个deferred对象 2.deferred.done()-- ...

  9. caffe简易上手指南(二)—— 训练我们自己的数据

    训练我们自己的数据 本篇继续之前的教程,下面我们尝试使用别人定义好的网络,来训练我们自己的网络. 1.准备数据 首先很重要的一点,我们需要准备若干种不同类型的图片进行分类.这里我选择从ImageNet ...

随机推荐

  1. dgraph实现基本操作

    dgraph实现基本操作 简单介绍 dgraph 是一个分布式图数据库 mutate 为一个突变, 一般认为添加数据或者是删除数据为一个突变 query 为一个查询 golang实现dgraph的基本 ...

  2. c/c++程序连接mysql

    1.libmysql.dll添加到System32文件夹 “regsvr32 libmysql.dll”注册 2.项目-->属性-->c/c++-->常规-->附加包含目录-- ...

  3. pthread 线程立即取消的两种方法

    1.相关函数介绍 a. int pthread_cancel(pthread_t thread) 1发送终止信号给thread线程,如果成功则返回0,否则为非0值.发送成功并不意味着thread会终止 ...

  4. Synchronized与ReentrantLock区别总结(简单粗暴,一目了然)

    这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍. 相似点:这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的 ...

  5. 2018-2019-2 20165232 《网络对抗技术》 Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165232 <网络对抗技术> Exp6 信息搜集与漏洞扫描 一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容. 各种搜索技巧的应 D ...

  6. (一)V4L2学习流程

    title: V4L2学习流程 date: 2019/4/23 18:00:00 toc: true --- V4L2学习流程 参考资料 关键资料,插图让人一下子就理解了 Linux摄像头驱动1--v ...

  7. SVN状态说明

    svn status查看工作副本中目录与文件的状态 命令格式:svn status [PATH](简写:svn st) 打印工作拷贝中文件和目录的状态. svn st|grep ^状态(获得某状态文件 ...

  8. shell 脚本实现定时备份mysql数据库

    首先要知道直接在脚本中输入mysql的密码是不被允许的,但是我们可以曲线救国 1. 在新建一个文件专门用来存储用户密码 如: vim ./.mysql.conf [mysqldump] user=yo ...

  9. HTML基础之JS中的字符转义--转义中文或特殊字符

    1.在标准的url的规范中是不允许出现中文字符或某些特殊字符的,所以要进行转义 2.& 代表参数的链接,如果就是想传& 给后端那么必须转义 decodeURI(url) URl中未转义 ...

  10. Android Ndef Message解析

    @concept:NDEF NFC Form论坛定义的NFC数据交换通用数据格式. 如上所示:一条NDEF消息由诸多Record记录组成,Record又由Header和Payload组成,Header ...