关于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,并不是执行结果.这里的代码很想递归,但是不是 ...
随机推荐
- 关于ThinkPHP独立分组的一些使用注意事项
关于ThinkPHP的独立分组,功能看上去挺好的,可是官方并没有给出详细的例子和说明,在此,根据实际的开发过程,给予各位php开发人员以下几点说明: 1.独立分组的目录结构 和官方说明一样,建立Mod ...
- Vue ----------- 了解, 展示json 数据
Vue.js 是一套构建用户界面的渐进式框架. 优点: 与大型框架不同的是采用自底向上的增量开发的设计, 只聚焦于视图层,不仅易于上手,还便于与第三方库或既有项目整合 当与现代化工具链以及各种类库结 ...
- 创建新react项目 运行npm start 报错踩过的坑
1.看react官网创建新的react项目 :npx create-react-app my-app cd到my-app npm start 遇见如下报错 这是因为电脑本地git的原因 ,不是 ...
- linux 重启jmeter服务
#!/bin/bash #jmeter kill and start echo -e '\033[32m--------Jmeter---------------\033[0m' echo " ...
- 2019 C/C++《阿里》面试题总结
一.C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛. C中函数不能进行重载,C++函数可以重载 C++在C的基础上增添类,C是一个结构化语言 ...
- linux - 用户配置文件
用户配文件: 1用户信息文件 /etc/passwd 2 影子文件 /etc/shadow 3 组信息文件 /etc/group 4 组密码文件 /etc/gshadow 1 用户信息文件 / ...
- Remote System Explorer Operation总是运行后台服务,卡死eclipse解决办法
当你右键编辑控件的id或者其他属性时都会卡很久,发现原来是eclipse后台进程在远程操作,就是右下角显示的“Remote System Explorer Operation”.折腾了半天,在Stac ...
- 史上最全HashMap红黑树解析
HashMap红黑树解析 红黑树介绍 TreeNode结构 树化的过程 红黑树的左旋和右旋 TreeNode的左旋和右旋 红黑树的插入 TreeNode的插入 红黑树的删除 TreeNode的删除节点 ...
- C# vb .NET读取识别条形码线性条码ean-8
ean-8是比较常见的条形码编码规则类型的一种.如何在C#,vb等.NET平台语言里实现快速准确读取该类型条形码呢?答案是使用SharpBarcode! SharpBarcode是C#快速高效.准确的 ...
- 基于tensorflow的简单鼠标键盘识别
import cv2 as cvimport tensorflow as tfimport numpy as npimport random ##以下为数据预处理,分类为cata,总共样本为cata* ...