【问题标题】:Node.JS callback after getting return value from function从函数获取返回值后的Node.JS回调
【发布时间】:2018-06-22 23:05:09
【问题描述】:

在我的 main.js 文件中,我有这个对象:

var options = {
    foo: 'bar',
    foofoo: 'barbar',
    accountBalance: getBalance()
};

函数getBalance() 在服务器上发出POST 请求以获取用户帐户的资金余额。返回余额后,我需要调用另一个函数myFunc(),如下所示:

var options = {
    foo: 'bar',
    foofoo: 'barbar',
    accountBalance: getBalance() //when accountBalance is returned, call myFunc() from here
};

function muFunc(){
//do something
}

getBalance 函数:

var request = require('request');
function getBalance(){
        request(POSToptions, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            return body.balance;
         } else {
           console.log("ERR" + body);
        }
     });  
  }

我知道我需要使用回调函数,但我仍然无法理解这个概念。有人可以帮助我并最好提供有关如何创建回调函数的解释吗?谢谢!

【问题讨论】:

  • 如果 getBalance 发送 POST 请求它是异步函数,那么 accountBalance 是一个承诺或未定义(如果你使用回调)。你能展示一下getBalance 函数的样子吗?
  • 我在帖子中添加了 getBalance 功能
  • 您错误地定义了options 对象。所以getBalance是异步函数,你不能立即得到响应,所以options.accountBalance将是未定义的。从getBalance 函数调用muFunc 怎么样,只需将它作为回调传递:getBalance(myFunc) 并在那里调用它。

标签: node.js callback


【解决方案1】:

根据问题,我们需要使用options 对象中的一个属性来创建http call(在这种情况下,accountBalance 属性指的是一个函数)。

因为http request本质上是异步的,一旦请求被处理,我们就会得到一个回调。

我的解决方案是在选项对象中再添加一个属性,一旦触发回调,该属性就会被触发。

在下面的示例中,我使用了http get call,但理想情况下,它对于任何 http 动词都应该保持不变。

查看以下示例 -

(() => {

    function getBalance() {
        //do your stuff here
        //then ajax call
        $.get('URL', (response) => {
            //call callback function in http response callback.
            options.callback(response);
        });
    }

    function callback(response) {
        console.log(response);
    }

    let options = {
        foo: 'bar',
        foofoo: 'barbar',
        accountBalance: getBalance,
        callback: callback
    };

    //make ajax call here
    options.accountBalance();

})();

我在包含callback function referenceoptions object 中添加了另一个名为callback 的属性。

编辑 - 我已将 AJAX 回调替换为 setTimeout 函数以模拟异步性质

(() => {

    function getBalance() {
        //do your stuff here
        //then ajax call
      setTimeout(() => {
          let response=  {
              data: "foo"
          }
          options.callback(response);
      }, 1000);
    }

    function callback(response) {
        console.log(response);
    }

    let options = {
        foo: 'bar',
        foofoo: 'barbar',
        accountBalance: getBalance,
        callback: callback
    };

    //make ajax call here
    options.accountBalance();

})();

我希望这会有所帮助:)

【讨论】:

  • 你能解释一下这里发生了什么吗?谢谢
  • options.accountBalance 在 OP 和您的示例中未定义。
  • 我在声明函数之前声明了选项!我的坏:|我现在已经编辑了答案。谢谢@alexmac
  • 还是不正确。阅读我在 OP 问题中的评论。
  • 我现在已经用代码 sn-p 验证了它!傻我
【解决方案2】:

你的 getBalance() 在执行 getBalance() 之前返回

你可以使用异步/等待

// npm install--save request
// npm install--save request-promise

var request = require('request-promise');

var getBalance = async () {
    return await request(POSToptions);
}


const muFunc = async () => {
    //do something
    var options = {
        foo: 'bar',
        foofoo: 'barbar',
        accountBalance: await getBalance()
    };
}

【讨论】:

    猜你喜欢
    • 2016-01-03
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多