javascript - 使用多个 .then 更正 JavaScript 的求值顺序

标签 javascript node.js promise

我正在努力让这段代码在 JavaScript 中同步。

注释(1,2 和 3)说明了按顺序发生的情况,现在它可以在创建新栏之前保存所有者。

我需要 findOne,可能需要 saveBar,然后是 saveOwner。

function setMyBar(req, res, next) {
  const owner = req.queryOwner;
  Bar.findOne({
    placeId: req.body.placeId
  })
    .then((bar) => {
      if(bar){
        owner.bar = bar; //1
        return owner;
      }else{
        barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude)
        .then((savedBar) => {
          owner.bar = savedBar; //3
          return owner;
        })
        .catch(e => {return Promise.reject(err) })
      }
    }).then(() => {
      owner.save()
        .then(savedOwner => res.json(savedOwner)) //2
        .catch(e => next(e));
    })
    .catch(e => next(e));
}

最佳答案

您需要在 else 条件的第一个 then() 中返回 promise 。现在没有返回任何内容,因此它会在 barCtrl.saveBar() 解析之前跳转到下一个 then

尝试

 Bar.findOne({
    placeId: req.body.placeId
  })
    .then((bar) => {
      if(bar){
        owner.bar = bar; //1
        return owner;
      }else{
       // return this promise
       return barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude)
        .then((savedBar) => {
          owner.bar = savedBar; //3
          return owner;
        })
        .catch(e => {return Promise.reject(err) })
      }
    }).then(() => {
      owner.save()
        .then(savedOwner => res.json(savedOwner)) //2
        .catch(e => next(e));
    })
    .catch(e => next(e));

关于javascript - 使用多个 .then 更正 JavaScript 的求值顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50573252/

相关文章:

javascript - Nodejs同步for循环

node.js - 如何使用 VueJs 读取 MongoDB 结果

mysql - Node/Bluebird/MySQL 事务

javascript - 为什么 Phaser 游戏在移动设备上滞后

javascript - 编写将所有内容都放在变量中的 Javascript 代码

javascript - 带有图例和其他颜色的 Google Charts API 散点图

javascript - 将更长的 javascript 放入executeScript

node.js - child_process 成功处理信号时的回调

web-services - 如何使用 AngularJS 进行顺序 Rest Web 服务调用?

javascript - 访问函数范围之外的变量但不使其成为全局变量(window.hazaa)?