异步方法x有返回值,那么y = x()的赋值是什么时候进行?
发布于 6个月前 作者 ciiii 486 次浏览

如最下面大段代码中有一句: ok = writer.write(data, encoding,function(){console.log(‘因为是异步,所以i都是0:’ , i);}); 这一句的write方法是异步,ok初始为false,那么在紧接着的下一句console.log(ok)中,ok应该为true还是false? 如果ok是false那么说明ok的赋值至少要在下一个事件循环里, 如果ok是true那么说明这个异步方法已经完成了?!并且有返回值。 实际是true,我就搞不懂了,不知道怎么理解。


var fs = require(‘fs’); var w = fs.createWriteStream(‘txt.txt’);

writeTimes(w,’utf8’,function(){console.log(‘完成’);});

function writeTimes(writer, encoding, callback) { var data = '’; var i = 10; write(); function write() { var ok = false; do { ok = false; data =new Date().getTime().toString() + '\n’; i -= 1; if (i === 0) { // last time! writer.write(data, encoding, callback); } else { ok = false; ok = writer.write(data, encoding,function(){console.log(‘因为是异步,所以i都是0:’ , i);}); console.log(‘write方法外,第 %d 次,write的返回: %s’ ,10-i, ok.toString()); } } while (i > 0 && ok); if (i > 0) { // had to stop early! // write some more once it drains writer.once('drain’, write); } } }

16 回复

OK = writer.writer() 因为没有RETURN 而writer函数的writer方法存在故返回TRUE?

我猜的。你的写法我看的太累了23333。

异步方法x有返回值,那么y = x()的赋值是什么时候进行? 如果X()是同步函数,那Y会等待X的返回值的。是异步会返回UNDEFINED貌似?。

这个是网上的实例,我就直接拿过来了。

改简单了点,可以直接考到一个js,然后Node一下就看结果

var fs = require(‘fs’); var w = fs.createWriteStream(‘txt.txt’); var data = '’; var i = 10; var ok = false;

do { ok = false; data =new Date().getTime().toString() + '\n’; i -= 1; ok = w.write(data, 'utf8’,function(){console.log(‘因为是异步,所以i都是0:’ , i);}); console.log(‘write方法外,第 %d 次,write的返回: %s’ ,10-i, ok.toString()); } while (i > 0 && ok);

write方法是有返回值的。

callback的执行和异步函数的返回没有关系。

函数就是函数,不管是同步还是异步的,x代码里return的是什么,y=x()在执行时y就被赋值为什么

@JacksonTian 能否这样理解,异步函数是立即返回了true,也就是说它是立即执行了?

@ciiii 所谓的异步函数是指callback在将来才执行。但是不管异步函数还是同步函数,执行完了就return了。

@JacksonTian 那它既然在将来执行,为什么在当前就返回TRUE了

@ciiii 不是说了么,callback的执行跟函数的返回值没有关系。

@JacksonTian 就是这里理解不了。。。。。

@JacksonTian 是不是说,只有callback是将来执行的,异步函数除了callback其他的过程是当时返回结果的?比如打开一个文件

@ciiii

function aaa(cb) { cb(); // 执行了回调,但函数还没到返回的时候 return 9999; // 这才是返回值 }

function aaa(cb) { process.nextTick(cb); // 会在未来执行回调,但现在这个aaa函数还没到返回的时候 return 9999; // 这才是返回值 }

@liuyanghejerry 应该是你的这个例子: function aaa(cb) { process.nextTick(cb); // 会在未来执行回调,但现在这个aaa函数还没到返回的时候 return 9999; // 这才是返回值 } “但现在这个aaa函数还没到返回的时候”,aaa函数的返回应该是当时就返回了。

回到顶部