nodejs 异步方法中如何return值

小小爱好者 2018-01-05 01:04:24
 function getAccessToken(){
var postJson = '';
var url='http://xxxxx.com/kkk';
//这里是一个异步调用
https.get(url, function(res) {
res.on('data', function (chunk) {
postData += chunk;
});
res.on('end', function(){
//这里是返回postData的值,因为是异步调用,当在return返回之前这个函数都已经运行完毕了,我怎么才能返回这个值呢?
//不想使用进程等待多少秒啥的方法,以为get请求不确定返回时间,
return postData;
});
}


不想使用进程等待多少秒啥的方法,以为get请求不确定返回时间,如果能改成同步方法也可以,我不懂,请各位帮忙
...全文
1131 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
推开世界的门 2018-11-18
  • 打赏
  • 举报
回复
[code=javascript]A语句:
var data = fs.readFile("./test.txt");
B语句:
fs.readFile("./test.txt",function(err,data){

})

因为fs模块的readFile方法是异步方法,事实上 node中的fs模块,MongoDB模块基本上都是异步方法,一定要记住,异步函数不能通过return返回,不能通过等号接收,必须通过回调函数传实参的模式来传输数据。
因为用等号接收,上面的等号会执行语句,下面的等号也会执行语句,这条语句你不知道什么时候执行完毕,你执行完毕才要data改变,但是他已经执行后面的语句了,来不及管data了,
用回调函数:fs.readFile先读,把后面的语句先做了,发现后面也有断点(I/o事件),如果在执行异步的事件,不会立即执行回调函数,遇到一个i/o断点,就会执行里面的语句。


木瓜~ 2018-01-24
  • 打赏
  • 举报
回复
其实你可以采用下面这种方法, 我把你https改成了fs,但是原理都是一样的。
都是利用Promise来实现,当函数读取文件结束时候,进入then,进行你想要的操作。


const fs = require('fs');
const fileName = process.argv[2];

function readFile(fileName) {
return new Promise((resolve, reject) => {
fs.readFile(fileName, (error, data) => {
if (error) return reject(error);
return resolve(data);
});
});
};

readFile(fileName)
.then((data) => {console.log(data.toString());})
.catch(console.error);

调试结果:
changpzh@20:24:~/tmp$ node test.js test.txt
test line
second line
contents dispalyed
functionsub 2018-01-05
  • 打赏
  • 举报
回复
 function getAccessToken(callback){
        var postJson = '';
        var url='http://xxxxx.com/kkk';
//这里是一个异步调用
    https.get(url, function(res) {
              res.on('data', function (chunk) { 
                postData += chunk; 
              });   
             res.on('end', function(){
//这里是返回postData的值,因为是异步调用,当在return返回之前这个函数都已经运行完毕了,我怎么才能返回这个值呢?
//不想使用进程等待多少秒啥的方法,以为get请求不确定返回时间,
            callback && callback(postData);
            return postData;
           });
   }
function getAccessTokenCallback(res){ // 定义一个回调函数
    console.log(res);
}
getAccessToken(getAccessTokenCallback);// 把上面定义的回调函数当做参数传进去,这里也可以直接写一个匿名函数
小小爱好者 2018-01-05
  • 打赏
  • 举报
回复
引用 1 楼 functionsub 的回复:
没办法。只能给这个方法加一个回调函数,在请求完成后,调用这个回调函数,并且把响应内容传过去。
我太笨了 没有弄明白
小小爱好者 2018-01-05
  • 打赏
  • 举报
回复
引用 1 楼 functionsub 的回复:
没办法。只能给这个方法加一个回调函数,在请求完成后,调用这个回调函数,并且把响应内容传过去。
谢谢明白了
老马何以识途 2018-01-05
  • 打赏
  • 举报
回复
用ajax,可以設置處理完成時的回調函數。
functionsub 2018-01-05
  • 打赏
  • 举报
回复
没办法。只能给这个方法加一个回调函数,在请求完成后,调用这个回调函数,并且把响应内容传过去。

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧