【问题标题】:Nested callbacks run asynchronously嵌套回调异步运行
【发布时间】:2017-11-21 16:43:55
【问题描述】:

我怎样才能克服这个异步代码并在回调之间传递值?

这里的 totalfee 变量在第一个回调中设置,但在第二个回调中不可访问。

 var totalfee;
 SetFee.find({standard:standard}, function(error,document){
  totalfee = document[0].totalfee;
  CollectFee.find({ssn:ssn}, function(error,document){
        if(typeof(document[0])=='undefined'){
          let paidfee=0;
          var cfee = new CollectFee({
            ssn:ssn,
            paidfee:paidfee
          });
          cfee.save();
        }
        else {
          showpaid=document[0].paidfee;
          console.log(ssn,name,totalfee,showpaid);
          res.redirect('/fees/cfees?ssn='+ssn+'&name='+name+'&totalfee='+totalfee+'&paidfee='+showpaid);
        }
  });            
});

REFERENCE IMAGE

【问题讨论】:

  • 恕我直言,它应该可以访问。设置时检查它的值。
  • 它绝对必须是可访问的,它具有指定值的天气是另一回事。
  • 如果指令一个接一个地执行,它必须是可访问的,但这里其他指令在 totalfee=document[0].totalfee 之前被执行
  • @Adder 我认为这是一个回调地狱的例子。你知道如何解决它吗?
  • 你在totalfee = document[0].totalfee;后面加了console.log("totalfee set to ", totalfee);

标签: javascript node.js asynchronous mongoose


【解决方案1】:

也许这些指针会指引你到某个地方。

(1) 使用findOne,因为您需要一个文档。

(2) 为变量使用更好的名称,例如document 不明确。

(3) 添加console.log 语句进行调试。

(4) 检查err 以查看是否出现任何错误可能是个好主意。通常,错误只会在您插入/更新/删除时发生。

SetFee.findOne({ standard: standard }, function (err, setFee) {
    console.log('setFee', setFee)
    let totalfee = setFee.totalfee;

    CollectFee.findOne({ ssn: ssn }, function (err, collectFee) {
        console.log('collectFee', collectFee)
        if (!collectFee) {
            // use of return is to stop the 'else' part from executing
            return CollectFee.create({ ssn: ssn, paidfee: 0 }, function (err, collectFee) {
                // do something here or your route handler will hang!
            });
        }
        let showpaid = collectFee.paidfee;
        console.log(ssn, name, totalfee, showpaid);
        res.redirect('/fees/cfees?ssn=' + ssn + '&name=' + name + '&totalfee=' + totalfee + '&paidfee=' + showpaid);
    });            
});

【讨论】:

  • 干净的代码!但这并没有解决我的问题。感谢您的努力!
  • @Vishnudev 解释。 console.log 是否产生正确的输出?是挂了吗?哪里失败了?
  • 如果我在第一个回调中 console.log(totalfee) 它返回预期的输出,但在第二个回调中它返回 null 。
  • @Vishnudev Weird...totalfee 的范围应该可以在第一个回调(包括第二个回调)中访问。你没有做任何其他事情,对吧?首先尝试将let 更改为var。如果运气不好,请尝试在第二个回调中执行console.log(setFee.totalfee)
  • XD 我实际上已经尝试了你之前所说的一切。没有成功!你知道如何在 Async.js 中实现它吗?
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 2018-06-27
  • 2021-08-11
相关资源
最近更新 更多