【问题标题】:How execute code in a certain sequence in nodeJS?nodeJS中如何按一定顺序执行代码?
【发布时间】:2020-06-06 04:07:21
【问题描述】:

我在 nodeJS 中有这个问题,其中调用 4 个异步函数下面的代码在函数返回任何数据之前执行。下面的代码应该以 json 格式返回每个调用的状态。如何按顺序执行每个功能?那么当我将数据返回给调用者时,它会显示每个函数中发生的更新状态或错误?

这就是我现在拥有的..

let idItem = "";
    let statusInsert = "N/A";
    let statusSms = "N/A";
    let statusEmail = "N/A";
    let msgErro = "N/A";


    try {

        let retorno = inserirEmergencia(req).then(
        iar => {
            console.log(iar);
            idItem = iar.data.ID;
            statusInsert = "OK";
        }
        );  

      } catch (e) {
        //Error handling
        idItem = "0";
        statusInsert = "Erro";
        msgErro += " > " + e.message;
      }

      let jsonResposta = 
      {
          "idItem" : idItem,
          "statusInsert" : statusInsert,
          "statusSms" : statusSms,
          "statusEmail" : statusEmail,
          "msgErro" : msgErro
      }

      res.json(jsonResposta);

所以,jsonResposta 有初始值,我如何执行四个这样的函数并确保最后的值是实际函数返回的值?

【问题讨论】:

标签: javascript node.js typescript express ecmascript-6


【解决方案1】:

您可能知道,在 node.js 中事情是异步运行的。因此,当您需要让事物以特定顺序运行时,您需要使用控件库或基本上自己实现它。

建议你看看以下几个概念:

1) 回调函数。

2) 异步和等待

通过这些,您可以控制执行流程。

【讨论】:

    【解决方案2】:

    每个异步函数都会返回一个 Promise,因此为了防止非阻塞代码执行,您可以在 Promise 解析后放置该代码。即通过调用 .then 的回调函数,或者只是等待 promise 解决然后执行任务。

    【讨论】:

      【解决方案3】:

      除非你把它放在async 函数和await 中,否则你不能尝试/捕获 Promise 中的异常。

      这是使用 Promise 结果构建此流程的方式:

      let idItem = "";
          let statusInsert = "N/A";
          let statusSms = "N/A";
          let statusEmail = "N/A";
          let msgErro = "N/A";
      
          inserirEmergencia(req)
          .then(iar => {
             idItem = iar.data.ID;
             statusInsert = "OK";
           })
           .catch(e => {
              idItem = "0";
              statusInsert = "Erro";
              msgErro += " > " + e.message;
           })
           .then(() => res.json({
                "idItem" : idItem,
                "statusInsert" : statusInsert,
                "statusSms" : statusSms,
                "statusEmail" : statusEmail,
                "msgErro" : msgErro
            }))
      

      这是另一种方式,对数据采用不同的方法。您正在“根据响应转换默认数据对象,然后将其传递给res.json 调用”,因此您可以这样做:

      const defaults = {
        idItem: "0",
        statusInsert: "N/A",
        statusSms: "N/A",
        statusEmail: "N/A",
        msgErro: "N/A"
      }
      
      inserirEmergencia(req)
          .then(iar => ({
             ...defaults,
             idItem: iar.data.ID,
             statusInsert: "OK"
           })
           .catch(e => ({
              ...defaults,
              statusInsert: "Error",
              msgErro: ` > ${e.message}`
           })
           .then(res.json)
      

      这是使用async/await 的方法:

      post('/emergencia', async (req, res) => {
         const defaults = {
           idItem: "0",
           statusInsert: "N/A",
           statusSms: "N/A",
           statusEmail: "N/A",
           msgErro: "N/A"
         }
         try {
            const iar = await inserirEmergencia(req)
            return res.json({
               ...defaults,
                idItem: iar.data.ID,
                statusInsert: "OK"
            })
         } catch (e) {
            return res.json({
               ...defaults,
               statusInsert: "Error",
               msgErro: ` > ${e.message}`
            })
         }
      }
      

      您可以通过内联对inserirEmergencia 的调用来进一步压缩:

      post('/emergencia', async (req, res) => {
         const defaults = {
           idItem: "0",
           statusInsert: "N/A",
           statusSms: "N/A",
           statusEmail: "N/A",
           msgErro: "N/A"
         }
         try {
            return res.json({
               ...defaults,
                idItem: (await inserirEmergencia(req)).data.ID,
                statusInsert: "OK"
            })
         } catch (e) {
            return res.json({
               ...defaults,
               statusInsert: "Error",
               msgErro: ` > ${e.message}`
            })
         }
      }
      

      最后一个模糊了侧面输入,这对维护者没有帮助 - 包括将来的你。这还不错,但是您将那里的数据转换与 API 调用混合在一起,所以我不会这样做。只需包含它,以便您了解更多关于在 JS 中学习异步的可能性的信息。

      【讨论】:

        猜你喜欢
        • 2021-03-16
        • 1970-01-01
        • 2011-02-07
        • 2020-10-08
        • 1970-01-01
        • 2017-07-30
        • 1970-01-01
        • 2015-06-15
        • 1970-01-01
        相关资源
        最近更新 更多