疑问:感觉会报错,因为执行到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的更多相关文章

  1. 剖析Promise内部结构,一步一步实现一个完整的、能通过所有Test case的Promise类

    本文写给有一定Promise使用经验的人,如果你还没有使用过Promise,这篇文章可能不适合你,建议先了解Promise的使用 Promise标准解读 1.只有一个then方法,没有catch,ra ...

  2. [20180713]关于hash join 测试中一个疑问.txt

    [20180713]关于hash join 测试中一个疑问.txt --//上个星期做的测试,链接: http://blog.itpub.net/267265/viewspace-2157424/-- ...

  3. 关于约束ENABLE NOVALIDATE的一个疑问

    http://www.dbunix.com/?p=188 关于约束ENABLE NOVALIDATE的一个疑问 CREATE TABLE test (id varchar2(12), name var ...

  4. ECMAScript prototype的一个疑问。

    既然是疑问 当然首先要贴一段代码. 背景: 探究js的原型继承模式. 疑惑:为何person1和person2的prototype 居然是相等的. 附: 1.Object.create(proto, ...

  5. [apue] 管道原子写入量的一个疑问

    PIPE_BUF定义了管道可原子写入的数据量,在我的系统(CentOS 6.7)上这个值是4096,写了个程序验证了一下,通过三个维度来考察: N: 生产者数量 M:每个生产者的生产次数 P:每次写入 ...

  6. javascript中的异步操作以及Promise和异步的关系

    https://segmentfault.com/a/1190000004322358 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和强大 https://se ...

  7. js利用递归与promise 按顺序请求数据

    问题:项目中有一个需求,一个tabBar下面如果没有内容就不让该tabBar显示,当然至于有没有内容,需要我们通过请求的来判断,但是由于请求是异步的,如何让请求按照tabBar的顺序进行? 方案:我们 ...

  8. Entity Framework 6 Recipes 2nd Edition(11-6)译 -> 从一个”模型定义”函数里返回一个复杂类型

    11-6.从一个”模型定义”函数里返回一个复杂类型 问题 想要从一个”模型定义”函数返回一个复杂类型 解决方案 假设我们有一个病人(patient)和他们访客(visit)的模型,如 Figure 1 ...

  9. js柯里化的一个应用

    听到同学说面试一道题目 add(1)(2)(3)(4); 查询了下资料  这是一个js里面的柯里化 现象 add_curry防范返回的是一个 retVal,并不是执行结果.这里的代码很想递归,但是不是 ...

随机推荐

  1. python抓取每期双色球中奖号码,用于分析

    获取每期双色球中奖号码,便于观察,话不多说,代码如下 # -*- coding:utf-8 -*- # __author__ :kusy # __content__:获取每期双色球中奖号码 # __d ...

  2. URL中出现了%E2%80%8E(Zero-Width Space)

    下面两个url地址,看起来是一样的,但是粘贴到记事本里会发现一个多出了很长的空格 url: '/secure​/Dishes/GetList', url: '/secure/Dishes/GetLis ...

  3. tomcat启动完成执行 某个方法 定时任务(Spring)

    第一步引入接口: ServletContextListener @RestController @RequestMapping("/schedule") public class ...

  4. 浅谈maven setting.xml 设置的mirrorof标签作用。

    https://blog.csdn.net/whbing1471/article/details/53983779 A 看这一段 背景:写好的java项目放置到linux服务器上进行编辑的时候,由于m ...

  5. 封装:Windows系统文件图标

    原文:封装:Windows系统文件图标 用途:用于获取文件系统默认图标 using System; using System.Collections.Generic; using System.Dra ...

  6. 《JavaEE开发的颠覆者——Spring Boot实战》是一本好书

    这本书的风格非常好.每一节都是先点明这一块知识的要点,随后就手把手的做出一个最简明.但有能体现核心的实例(大多只有几个Class) 这样的书用来熟悉一门框架,实在是再好不过.

  7. php curl 转为 x-www-form-urlencoded 方式的坑

    网上转变的方法基本都是写添加下面这句: curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-fo ...

  8. Excel 逐条导入Mysql(数据更新)

    其实,我的业务流程是, 先读取excel/csv -> pandas 数据清洗 -> 导入Mysql, 一般是做一个表append 或者是 if exist -> replace的操 ...

  9. python之处理excel表格

    xlrd ​ xlrd是python中一个第三方的用于读取excle表格的模块,很多企业在没有使用计算机管理前大多使用表格来管理数据,所以导入表格还是非常常用的! 安装xlrd pip install ...

  10. H3C 802.11 WEP加密特点与注意事项