Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用multiple更正JavaScript的求值顺序_Javascript_Node.js_Promise - Fatal编程技术网

使用multiple更正JavaScript的求值顺序

使用multiple更正JavaScript的求值顺序,javascript,node.js,promise,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

我很难让这段代码在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
条件中返回()。现在没有返回任何内容,因此它会跳转到下一个
,然后在
barCtrl.saveBar()
解析之前跳转到下一个

试一试


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

试一试

试试这个

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{
        // return should do the magic
        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));
}
当你在承诺范围内归还某物时,它将作为承诺归还。 而要想实现承诺,你当前的承诺必须回报一个承诺。你不做的地方试试这个

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{
        // return should do the magic
        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));
}
当你在承诺范围内归还某物时,它将作为承诺归还。
而要想实现承诺,你当前的承诺必须回报一个承诺。如果您不这样做

您可以通过使用承诺链简化很多:

function setMyBar(req, res, next) {
  Bar.findOne({
    placeId: req.body.placeId
  }).then(bar => {
    if (bar) {
      return bar;
    } else {
      return barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude);
    }
  }).then(savedBar => {
    const owner = req.queryOwner;
    owner.bar = savedBar;
    return owner.save();
  }).then(savedOwner => {
    res.json(savedOwner);
  }, e => {
    next(e);
  });
}
重要的变化是:

  • return
    保存栏
承诺等待它,您可以在下一次(外部)
回调中使用它的结果,然后
回调
  • ownwer.bar
    赋值放在下一个回调中,如果查询已经找到它,只需
    返回bar
    ,以避免代码重复
  • 删除无意义的
    .catch(e=>{return Promise.reject(err)})

  • 通过使用承诺链,您可以简化很多:

    function setMyBar(req, res, next) {
      Bar.findOne({
        placeId: req.body.placeId
      }).then(bar => {
        if (bar) {
          return bar;
        } else {
          return barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude);
        }
      }).then(savedBar => {
        const owner = req.queryOwner;
        owner.bar = savedBar;
        return owner.save();
      }).then(savedOwner => {
        res.json(savedOwner);
      }, e => {
        next(e);
      });
    }
    
    重要的变化是:

    • return
      保存栏
    承诺等待它,您可以在下一次(外部)
    回调中使用它的结果,然后
    回调
  • ownwer.bar
    赋值放在下一个回调中,如果查询已经找到它,只需
    返回bar
    ,以避免代码重复
  • 删除无意义的
    .catch(e=>{return Promise.reject(err)})

  • 您还可以尝试使用ES7异步函数或异步/等待语法,这使您可以编写更加同步的代码,如果您愿意,代码仍然异步并行执行。它在所有主流浏览器的当前版本(IE除外)以及Node.js使用的Google的V8引擎中都受支持

    我很快就破解了你的代码,使用了异步/等待语法,其中可能有奇怪的错误,因为我只是想告诉你使用异步函数的好处。它应该是这样的:

    async function setMyBar(req, res, next) {
        const owner = req.queryOwner;
        try {
            let bar = await Bar.findOne({
                placeId: req.body.placeId
            });
    
            if (bar) {
                owner.bar = bar;
            } else {
                let savedBar = await barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude);
                owner.bar = savedBar;
            }
    
            res.json(await owner.save());
        } catch (e) {
            next(e);
        }
    }
    
    还要注意,异步函数声明中的async关键字确保函数始终返回承诺

    一些很好的链接可以阅读该功能,还提供了一些关于承诺的进一步背景信息:


    您还可以尝试使用ES7异步函数或异步/等待语法,这使您可以编写更加同步的代码,如果您愿意,代码仍然异步并行执行。它在所有主流浏览器的当前版本(IE除外)以及Node.js使用的Google的V8引擎中都受支持

    我很快就破解了你的代码,使用了异步/等待语法,其中可能有奇怪的错误,因为我只是想告诉你使用异步函数的好处。它应该是这样的:

    async function setMyBar(req, res, next) {
        const owner = req.queryOwner;
        try {
            let bar = await Bar.findOne({
                placeId: req.body.placeId
            });
    
            if (bar) {
                owner.bar = bar;
            } else {
                let savedBar = await barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude);
                owner.bar = savedBar;
            }
    
            res.json(await owner.save());
        } catch (e) {
            next(e);
        }
    }
    
    还要注意,异步函数声明中的async关键字确保函数始终返回承诺

    一些很好的链接可以阅读该功能,还提供了一些关于承诺的进一步背景信息:


    使用承诺不会使代码同步。它只是有助于使异步代码有序。使用承诺并不能使代码同步。它只是有助于使异步代码顺序化。