【问题标题】:Converting an asynchronous function to synchronous in node js?在节点js中将异步函数转换为同步?
【发布时间】:2018-01-11 00:28:07
【问题描述】:

我正在使用一个 API,它希望我通过卡的前四位数字并返回卡的国家/地区。现在,这是我的问题。事实证明,我正在调用的函数是异步的,当我尝试返回国家/地区时,它实际上在异步调用完全执行之前就已经返回值。我希望调用是同步的,这意味着我不希望函数返回默认数据并等待 API 的实际响应。这是我到目前为止所尝试的。我实际上使用了 console.log() 语句来找出整个问题。

module.exports = {
  bvncheck: function (cardnum) {
    console.log("cardnumber", cardnum);
    flutterwave.BIN.check(cardnum, function (req, res) {
      var country = res.body.data.country;
      console.log("country", country);
      return country;
    });
  }


};

app.post('/checkcardbin', function (req, res) {
  var cardnumber = req.body.cardnumber;

  //var r = fd.bvncheck(cardnumber);

  var r = fd.bvncheck(cardnumber);
  console.log("result", r);
});

我希望按以下顺序输出以下输出-

1. cardnumber *****
2. country  *****
3. result ******

但实际上,它按以下顺序返回我,并且由于异步性质,我得到未定义的结果,因为数据是在函数实际执行完成之前返回的。

1. cardnumber *****
2. result ******
3. country *****

我该如何解决这个问题?任何建议或建议都非常感谢。

【问题讨论】:

  • “将异步内容转换为同步”在单线程引擎上 = 非常糟糕的主意。拥抱异步并学习如何处理它 = 非常好的主意。

标签: javascript node.js asynchronous


【解决方案1】:

bvncheck 函数编写不正确。它是异步的,但它不提供传入回调的方法。正如目前所写的那样,无法从bvncheck 函数之外访问返回的国家/地区。那条return country; 行没有做任何价值。它应该看起来更像这样,

module.exports = {
  bvncheck: function(cardnum, callback) {
    console.log('cardnumber', cardnum);
    flutterwave.BIN.check(cardnum, function(req, res) {
      var country = res.body.data.country;
      console.log('country', country);
      callback(country);
    });
  },
};

注意传入的新 callback 参数,然后使用国家/地区值调用(而不是无处返回)。

这样使用,

app.post('/checkcardbin', function(req, res) {
  var cardnumber = req.body.cardnumber;
  fd.bvncheck(cardnumber, function(country) {
    var r = country;
    console.log('result', r);
  });
});

【讨论】:

    【解决方案2】:

    我不得不通过包含回调来更改您的模块。这样fd.bvncheck 就会等待回调。

    module.exports = {
            bvncheck: function (cardnum, callback) {
                console.log("cardnumber", cardnum);
                flutterwave.BIN.check(cardnum, function (req, res) {
                    var country = res.body.data.country;
                    console.log("country", country);
                    callback(country);
                });
            }
        }
        app.post('/checkcardbin', function (req, res) {
            var cardnumber = req.body.cardnumber;
    
            //var r = fd.bvncheck(cardnumber);
    
            fd.bvncheck(cardnumber, function(r) {
                console.log("result", r);
            });
    
        });
    

    【讨论】:

      【解决方案3】:

      你可以使用 Promise 来实现

      module.exports = {
        bvncheck: function(cardnum) {
          return new Promise(function(resolve, reject){
            flutterwave.BIN.check(cardnum, function(req,res){
              var country = res.body.data.country;
              resolve({country:country, cardnumber: cardnum});
            });
          });
      }
      
      app.post('/checkcardbin',function(req,res){
        var cardnumber = req.body.cardnumber;
        fd.bvncheck(cardnumber).then(function(v){
          console.log(v);
        });
      });
      

      【讨论】:

        【解决方案4】:

        您可以使用Promise.all。这是一个很好的解释: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

        【讨论】:

          猜你喜欢
          • 2020-07-16
          • 1970-01-01
          • 2015-06-25
          • 1970-01-01
          • 1970-01-01
          • 2012-07-25
          • 2017-12-09
          • 2021-10-29
          相关资源
          最近更新 更多