node.js如何获取异步函数回调的返回值。

function getTBS(){
    ng.get("http://tieba.baidu.com/dc/common/tbs",function(data,status,headers){
        console.log(data);//怎样把data作为getTBS的返回值?
    },headers,'utf8')
}
getTBS();//{"tbs":"a2bdd05a3fd08e561463670847","is_login":1}

百度了好久,说是用回调函数,但还是不太懂,能举个例子吗,求教求教。。

阅读 12.3k
5 个回答

你的getTBS函数返回之后data还没收到呢,不可能用return返回。
可一了解一下promise对象和async/await关键字,应该对你有帮助

function getTBS(callback){
    ng.get("http://tieba.baidu.com/dc/common/tbs",function(data,status,headers){
        callback(null,data)
    },headers,'utf8')
}
getTBS(function(err,result){
    if(err) throw err;
    console.log(result) //{"tbs":"a2bdd05a3fd08e561463670847","is_login":1}
});

回调函数
应该叫 异步 回调 函数
一般来说 发起异步请求 由于处理时间不确定
所以 传入一个函数 当异步请求完成时候会调用这个函数
你的程序才知道异步请求完成

你还是得去理解下什么是异步操作

最直接的感受就是你不知道异步操作什么时候完成,也没有办法直接获取到异步操作的结果

所以异步操作要借助回调函数或者promise去实现异常的捕获和结果的获取

private async initProteinObject(TXTFilesPath: string): Promise<any> {
    return new Promise((resolve, reject) => {
      fs.readdir(TXTFilesPath, async (err, files: string[]) => {
        if (err) {
          console.error(err);
          return;
        }
        const promises = files.map(file => {
          return new Promise((resolve, reject) => {
            const filrdir: string = path.join(TXTFilesPath, file);
            if (path.extname(filrdir) === '.txt') {
              fs.stat(filrdir, async (err, stats) => {
                if (err) {
                  console.error(err);
                  return;
                }
                if (stats.isFile()) {
                  const rl = readline.createInterface(
                    fs.createReadStream(filrdir),
                  );
                  const proteinObject: IProteinObject = {};
                  for await (const line of rl) {
                    const fastaName = line.split(':')[0];
                    const idList = line.split(':')[1];
                    let temList = [];
                    temList = [...new Set(idList.trim().split(' '))];
                    for (let i = 0; i < temList.length; i++) {
                      const ele = temList[i];
                      proteinObject[ele] = fastaName;
                    }
                  }
                  resolve(proteinObject);
                }
              });
            } else {
              resolve({});
            }
          });
        });
        let res = {};
        Promise.all(promises).then(arr => {
          arr.forEach(item => Object.assign(res, item));
          resolve(res);
        });
      });
    });
  }

改好了,大概这样,问题不会关闭,感觉代码健壮性不够,欢迎赐教。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏