简易promise的实现(二)
上一章中我们遇到了两个问题
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的实现(二)的更多相关文章
- 简易promise
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- 实现简易Promise
概述 异步编程离不开promise, async, 事件响应这些东西,为了更好地异步编程,我打算探究一下promise的实现原理,方法是自己实现一个简易的promise. 根据promise mdn上 ...
- django 开发简易博客(二)
这一节我们来了解模板和视图.URL的使用. 一.使用模板 在blog目录中新建templates文件夹,在templates文件夹下新建base.html文件.目录结构如下 templates/ ba ...
- 一步一步实现基于Task的Promise库(二)all和any方法的设计和实现
在上一篇中我们已经初步完成了Task类,如果仅仅是这些,那么没有多大意义,因为网上这类js库有很多,现在我们来些更复杂的使用场景. 如果我们现在有这样一个需求:我们要先读取aa.txt的内容,然后去后 ...
- 简易promise的实现(一)
code 最近在思考promise的实现原理 于是准备自己写一个简单的demo 一开始想到的问题有两个 1.链式调用 2.异步顺序执行 -------------------------------- ...
- 基于Java的简易表达式解析工具(二)
之前简单的介绍了这个基于Java表达式解析工具,现在把代码分享给大家,希望帮助到有需要的人们,这个分享代码中依赖了一些其他的类,这些类大家可以根据自己的情况进行导入,无非就是写字符串处理工具类,日期处 ...
- C 实现一个简易的Http服务器 (二)
正文 - 直接搞起 C 实现一个简易的Http服务器 很久以前写过一个简易的http服务器, 后面和一个朋友交流, 反思后发现问题不少.在这里简单搞一下. 让其更加简单去表现httpd本质, 弱化协议 ...
- deferred对象和promise对象(二)---deferred对象
早上醒来,继续讨论deferred对象和primise对象. deferred对象的的方法: 1.$.Deferred()-----生成一个deferred对象 2.deferred.done()-- ...
- caffe简易上手指南(二)—— 训练我们自己的数据
训练我们自己的数据 本篇继续之前的教程,下面我们尝试使用别人定义好的网络,来训练我们自己的网络. 1.准备数据 首先很重要的一点,我们需要准备若干种不同类型的图片进行分类.这里我选择从ImageNet ...
随机推荐
- centos7环境搭建命令List
npm -ivh jdk-8u191-linux-x64.rpm adduser sai passwd sai whereis sudoers vim /etc/sudoers rpm -qa | g ...
- dsu on tree 树上启发式合并 学习笔记
近几天跟着dreagonm大佬学习了\(dsu\ on\ tree\),来总结一下: \(dsu\ on\ tree\),也就是树上启发式合并,是用来处理一类离线的树上询问问题(比如子树内的颜色种数) ...
- MVN TEST指定运行脚本
clean:表示将你上一次编译生成的一些文件删除 test:表示只执行测试代码 >mvn clean test -Dtest=[ClassName] 运行测试类中指定的方法:这个需要maven- ...
- 实验二 Java面向对象程序设计实验报告
实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...
- DirectX11--实现一个3D魔方(3)
前言 (2019/1/9 09:23)上一章我们主要讲述了魔方的旋转,这个旋转真是有毒啊,搞完这个部分搭键鼠操作不到半天应该就可以搭完了吧... (2019/1/9 21:25)啊,真香 有人发这张图 ...
- python try exception finally记录
try exception finally中,finally下的语句块始终会执行 测试finally代码 def test_try_exception(a, b): '''测试异常捕获语句''' re ...
- 一、C语言调试—— gdb 的使用
1.1 gdb 调试工具常用命令 list:展开调试的源代码,缩写 l: break:设置断点,缩写为 b: info break:查看断点信息,缩写为 i b delete:删除断点 print:打 ...
- content+animation实现loading效果
<dot></dot> dot { display: inline-block; height: 1em; line-height: 1; vertical-align: -. ...
- 小程序跳转 H5 时 cookie 值处理问题
小程序使用 <web-view></web-view> 内嵌 H5,当跳转至 H5 后,校验用户的登录状态是最重要的. 在做手中的项目 b.xx.com 时,需要调用另一个域名 ...
- 小程序 <web-view></web-view> 中使用 form 表单提交
在最近的小程序项目中,使用到了 <web-view></web-view> 内嵌 H5 页面,在 H5 中需要使用 form 表单提交数据. H5 使用的技术框架是 vue+v ...