【问题标题】:How to get returned a value by a callback function如何通过回调函数获取返回值
【发布时间】:2013-01-06 13:52:06
【问题描述】:

这是我的代码

function save_current_side(current_side) {
    var result;
    var final = a.b({
        callback: function (a) {
            console.log(a); // its working fine here 
            return a;
        }
    });
}

其中 b 是同步函数。 我在代码中的任何地方调用上述函数

var saved =  save_current_side(current_side);

保存的变量未定义。回调函数如何获取返回值

【问题讨论】:

  • b() 是什么?是异步方法吗?
  • 你的例子中的 a.b() 是什么?我被难住了。

标签: javascript jquery callback


【解决方案1】:

如果b 是一个同步方法,您只需将值存储在一个变量中,这样您就可以从save_current_side 函数而不是回调函数返回它:

function save_current_side(current_side) {
  var result;
  a.b({
    callback: function (a) {
      result = a;
    }
  });
  return result;
}

如果b 是异步方法,则无法从函数返回值,因为退出函数时它还不存在。使用回调:

function save_current_side(current_side, callback) {
  a.b({
    callback: function (a) {
      callback(a);
    }
  });
}

save_current_side(current_side, function(a){
  console.log(a);
});

【讨论】:

  • Dear Guffa 如何在回调后使用“save_current_side”中的值??
  • @KostantinosIbra:你不能,因为函数在回调之前返回。您可以从函数中返回您喜欢的任何内容并像往常一样使用它,但是在回调之前发生这种情况,您当时无法访问异步调用的结果。
【解决方案2】:

您只需将回调作为参数传递给函数,如下所示

function save_current_side(current_side,callback) {
   var result;
   var final = a.b(function(){
      callback(a);
   });
}

这就是你可以在代码中的任何地方调用它的方式

var saved;
save_current_side(current_side,function(saved){
     console.log(saved);
});

【讨论】:

    【解决方案3】:

    您需要提交回调函数。示例:

    function save_current_side(current_side, callback) {        
        a.b({
            callback: callback
        });
    }
    
    save_current_side(current_side, function() {
      console.log('saved'):
    });
    

    【讨论】:

    • 什么是 a.b()?还是只是一个()?
    【解决方案4】:

    使用承诺。一旦数据被读取/获取,就解决它。稍后,在调用点使用 then(data) 并在其中解析值。我的项目示例:

    function getImage(imagename) {
        return new Promise((resolve, reject) => {
            fs.readFile(`./uploads/${imagename}`, 'utf8', function(err, data){
                if(err) {
                    reject(null);
                    throw err;
                }
                resolve(data);
            });
        });
    }
    
    io.on('connection', async (socket) => {
            getImage(imagename).then(image => {
                console.log('Img contents: ' + image);
            });
            ....
        });
    });
    

    【讨论】:

    • const fs = require('fs');
    • upd: 将图像读取为 base64: const contents = await fs.promises.readFile(./uploads/${imagename}, { encoding: 'base64' });
    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 2018-06-25
    • 2014-05-28
    • 2021-11-17
    • 1970-01-01
    • 2020-01-12
    • 2019-12-29
    • 1970-01-01
    相关资源
    最近更新 更多