疑问:感觉会报错,因为执行到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(2)
defer.resolve(data)
})
console.log(1)
defer.promise.then(function(resData){
console.log(3)
console.log(resData)
}); ===============================================
柯里化做promisevar 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)
}) ------------------------------------------
用递归做promisevar 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');//27
}).then(res=>{
console.log(res);//27
}).catch(err=>{
console.log('err',err)
})
|