关于defer.promise.then 异步的一个疑问 | 用柯里化做promise | 用递归做promise
疑问:感觉会报错,因为执行到defer.promise.then这时候还没到defer.resolve,因为异步读文件,总归会慢
解答:先执行defer.promise.then,是给callback赋值,函数的赋值会比较抽象,callback得到函数的赋值后,是函数就该等待执行,等待resolve的时候,执行,其实也是回调的方式,
关键点:实参是函数,就是形参被复值成函数,把形参当函数看
var Defer = function(){
var value,callback;
return {
resolve :function(val){
value = val;
callback(val);
},
promise:{
then:function(fn){
callback = fn;
}
}
}
}
var fs = require('fs');
var defer = new Defer();
fs.readFile('data/account/accountInfo_0.html',(err,data)=>{
console.log()
defer.resolve(data)
})
console.log()
defer.promise.then(function(resData){
console.log()
console.log(resData)
});
===============================================
柯里化做promise
var Defer = function(){
var value,successes=[],errors=[];
return {
resolve :function(val){
successes.forEach(v=>{
if(!value){
value = v(val);
}else{
value = v(value)
}
})
},
reject:function(err){
errors.forEach(v=>{
v(err)
})
},
promise:{
then:function(fn){
successes.push(fn);
return this;
},
catch:function(fn){
errors.push(fn);
return this;
}
}
}
}
var fs = require('fs');
function readFile(filter){
var defer = new Defer();
fs.readFile(filter,'utf8',(err,data)=>{
if(err){
defer.reject(err)
}else{
defer.resolve(data)
}
})
return defer.promise;
}
// 当注册成功之后的回掉函数
var promise = readFile('test.txt');//my name is:
promise.then(res=>{
return res+'liujiny';
}).then(res=>{
console.log(res);//my name is:liujinyu
return fs.readFileSync('data/account/accountInfo_0.html');
}).then(res=>{
console.log(res+'')
}).catch(err=>{
console.log('err',err)
})
------------------------------------------
用递归做promise
var Defer = function(){
var success=[],
errors=[];
return {
resolve:function(_value){
success.forEach(v=>{
v(_value)
})
},
reject:function(err){
errors.forEach(v=>{
v(err)
})
},
promise:{
then:function(fn){
var d = new Defer();
var _fn = function(_value){
d.resolve(fn(_value));
}
success.push(_fn);
return d.promise;
},
catch:function(fn){
errors.push(fn);
return this;
}
}
}
}
var fs = require('fs');
function readFile(filter){
var defer = new Defer();
fs.readFile(filter,'utf8',(err,data)=>{
if(err){
defer.reject(err)
}else{
defer.resolve(data)
}
})
return defer.promise;
}
// 当注册成功之后的回掉函数
var promise = readFile('name.txt');//my name is:
promise.then(val=>{
return val+'liujiny';
}).then(res=>{
console.log(res);//my name is:liujinyu
return fs.readFileSync('age.txt');//
}).then(res=>{
console.log(res);//
}).catch(err=>{
console.log('err',err)
})
关于defer.promise.then 异步的一个疑问 | 用柯里化做promise | 用递归做promise的更多相关文章
- 剖析Promise内部结构,一步一步实现一个完整的、能通过所有Test case的Promise类
本文写给有一定Promise使用经验的人,如果你还没有使用过Promise,这篇文章可能不适合你,建议先了解Promise的使用 Promise标准解读 1.只有一个then方法,没有catch,ra ...
- [20180713]关于hash join 测试中一个疑问.txt
[20180713]关于hash join 测试中一个疑问.txt --//上个星期做的测试,链接: http://blog.itpub.net/267265/viewspace-2157424/-- ...
- 关于约束ENABLE NOVALIDATE的一个疑问
http://www.dbunix.com/?p=188 关于约束ENABLE NOVALIDATE的一个疑问 CREATE TABLE test (id varchar2(12), name var ...
- ECMAScript prototype的一个疑问。
既然是疑问 当然首先要贴一段代码. 背景: 探究js的原型继承模式. 疑惑:为何person1和person2的prototype 居然是相等的. 附: 1.Object.create(proto, ...
- [apue] 管道原子写入量的一个疑问
PIPE_BUF定义了管道可原子写入的数据量,在我的系统(CentOS 6.7)上这个值是4096,写了个程序验证了一下,通过三个维度来考察: N: 生产者数量 M:每个生产者的生产次数 P:每次写入 ...
- javascript中的异步操作以及Promise和异步的关系
https://segmentfault.com/a/1190000004322358 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和强大 https://se ...
- js利用递归与promise 按顺序请求数据
问题:项目中有一个需求,一个tabBar下面如果没有内容就不让该tabBar显示,当然至于有没有内容,需要我们通过请求的来判断,但是由于请求是异步的,如何让请求按照tabBar的顺序进行? 方案:我们 ...
- Entity Framework 6 Recipes 2nd Edition(11-6)译 -> 从一个”模型定义”函数里返回一个复杂类型
11-6.从一个”模型定义”函数里返回一个复杂类型 问题 想要从一个”模型定义”函数返回一个复杂类型 解决方案 假设我们有一个病人(patient)和他们访客(visit)的模型,如 Figure 1 ...
- js柯里化的一个应用
听到同学说面试一道题目 add(1)(2)(3)(4); 查询了下资料 这是一个js里面的柯里化 现象 add_curry防范返回的是一个 retVal,并不是执行结果.这里的代码很想递归,但是不是 ...
随机推荐
- [转帖]Elasticsearch数据库
Elasticsearch数据库 2018-05-06 11:30:48 七色米 阅读数 23634更多 分类专栏: 数据库 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转 ...
- springboot yml配置文件注入值
1.编写javabean: package com.example.springboot.bean; import org.springframework.boot.context.propertie ...
- golang学习笔记 ---interface
1. 什么是interface接口 interface 是GO语言的基础特性之一.可以理解为一种类型的规范或者约定.它跟java,C# 不太一样,不需要显示说明实现了某个接口,它没有继承或子类或“im ...
- SpringBootSecurity学习(25)前后端分离版之OAuth2.0 令牌中继
增加Eureka 前面介绍的项目都是授权服务和资源服务单独两个,这样在资源服务中的 check_token 地址都是写死的地址 : 下面我们把eureka加上,这样就可以直接用服务名了.eureka服 ...
- java中什么是包
一.什么是包 包允许将类组合成较小的单元(类似文件夹),使其易于找到和使用相应的类文件 包有助于避免命名冲突.在使用许多类时,类和方法的名称很难决定.有时需要使用与其他类相同的名称.包基本上隐藏了类并 ...
- Linux学习笔记之Linux磁盘及文件系统管理笔记
Linux磁盘及文件系统管理 CPU,memory(RAM),I/O i/o: disks,ehtercard disks:持久存储数据 接口类型: IDE(ata): 并口,133MB/s;并行总线 ...
- unable to retrieve container logs for docker kubernetes
参考 https://github.com/knative/docs/issues/300 This is what happens when the build is successful and ...
- 【转载】Jupyter Notebook 常用快捷键
原文:http://blog.csdn.net/lawme/article/details/51034543 Jupyter Notebook 有两种键盘输入模式.编辑模式,允许你往单元中键入代码或文 ...
- Odoo Controller详解
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826241.html 一:Controller 一般通过继承的形式来创建controller类,继承自od ...
- C/C++函数调用时传参过程与可变参数实现原理
C/C++函数调用时传参过程与可变参数实现原理 C语言的经典swap问题 在学习C语言的时候,我们大都遇到过一些经典例题,这些经典例题背后所代表的是往往是C/C++背后的一些运行原理,比如下面这个示例 ...