您的位置:首页 > 编程语言

Promise编程模式中链式调用时传值的一个小坑

2015-12-16 20:17 302 查看
“原谅不是为了优越感,而是清洁自己的心,不让自己的心成为怨恨之所。”

所以,我们要原谅那些编程里遇到的坑,让心地清净起来。

看了一下午Promise编程模式的入门教程,尝试着写一个链式调用的demo,一不小心还是掉进了坑里。好在坑不大,又迅速爬上来了。

var Q=require('q');
var fs=require('fs');

Promise.resolve('foo.txt').then(read).then(read)

function read(fn){
fs.readFile(fn,'utf-8',function(err,data){
if(err){
console.log('err')
return 'foo2.txt';

}

console.log(data+"\n");

return 'foo2.txt';

})

}


原本期许是先读出foo.txt文件中的文字,然后再读出foo2.txt中的文字。但是这么写,只打印出了foo.txt中的文字,然后,就没有然后了。

仔细检查之后,才意识到我把read方法的返回值写到了fs.read这个异步调用的方法里面去了。Promise原本是要在开始执行异步方法之前,就要明确好执行完了干嘛的。这么写岂不是必须要等到那个fs.read执行完了才知道给下一步传什么值。行文至此,又想到一个新问题:如果我下一步执行函数需要的参数就是要等上一步异步函数执行完毕才能得到,咋办???(先扔一边,回头再去填坑)

所以,这代码这么改一下,把return ‘foo2.txt’ 移到外面来就好了!

var Q=require('q');

var fs=require('fs');

Promise.resolve('foo.txt').then(read).then(read)

function read(fn){

fs.readFile(fn,'utf-8',function(err,data){

if(err){

console.log('err')

}

console.log(data+"\n");

})

return 'foo2.txt';

}


填坑完毕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: