【问题标题】:Using Async Values in another function (JavaScript)在另一个函数中使用异步值 (JavaScript)
【发布时间】:2019-04-10 09:03:33
【问题描述】:

我目前正在使用 Javascript 中的解构数组,我想在其他函数中访问这些变量,但目前,我正在努力弄清楚如何去做。

我已经尝试调用该函数,然后console.log(thermostatArray) -> 我相信这会返回待处理的承诺

我尝试调用该函数并等待它,然后console.log thermostatArray

dataFormat() 能够正常查看日志并使用数组,但 heatCallCheck() 不能,我还没有看到过去的问题。

var express = require("express");
var router = express.Router();
const multer = require("multer");
var Excel = require("exceljs");
const index = require("../routes/index");
const workbook = new Excel.Workbook();

async function convertFile(workbook) {
  csvWorkbook = workbook.csv.readFile("./uploads/uploadedFile.csv");
  await csvWorkbook.then(async function(csvWorkbook) {
    const worksheet = workbook.getWorksheet("sheet1");
    try {
      // await dataFormat(worksheet);
      await heatCallCheck(worksheet,)
    } catch (err) {
      console.log(err);
    }

    await workbook.xlsx.writeFile("./uploads/convertedFile.xlsx").then(() => {
      console.log("converted file written");
    });
  });
}


async function dataFormat(worksheet) {
  let thermostatArray = []
  await csvWorkbook.then(async function(worksheet) {
    const serialNum = worksheet.getCell("D1").value;
    const thermostatName = worksheet.getCell("D2").value;
    const startDate = worksheet.getCell("D3").value;
    const endDate = worksheet.getCell("D4").value;
    const thermostat = worksheet.eachRow({includeEmpty: true}, function(row,rowNumber){
      if (rowNumber > 6) {
      thermostatArray.push(row.values)
      }
    })
    console.log(`${thermostatArray[5]} Array Sample from dataFormat` )
    console.log(`${thermostatArray[6]} Array Sample from dataFormat` )
    return thermostatArray
})}


async function heatCallCheck(worksheet,thermostatArray) {
  let test = await dataFormat(worksheet).then(thermostatArray => {
    return thermostatArray[5]
  }).catch(err => {
    console.error(err)
  })
  console.log(`${test} result `)
}

在这种情况下,我的预期结果是,我可以使用 heatCallCheck() 函数看到恒温器数组中的第 4 个元素。

我想我可以在调用 .then 之后访问它。

我的理解是 .then(thermostatArray =>

使该数组成为返回值。

【问题讨论】:

  • 你不要同时使用awaitthen
  • thermostatArray 肯定不是承诺,因为您已将其定义为 []。我不清楚为什么你需要csvWorkbook.then 上的内部async 函数——你不会在其中的任何地方使用await。从exceljs docs 我不清楚csvWorkbook 是一个承诺。您是否需要等待它(这样做不会有害)?
  • @Adam 你当然可以同时使用awaitthen,尽管通常没有很好的理由这样做。 await 旨在替换 .then
  • @JasonHarder you await 一个承诺,然后只做普通代码。这个想法是摆脱嵌套的.then 调用
  • 您严重误解了异步 javascript。观看此youtube.com/watch?v=SrNQS8J67zc

标签: javascript node.js asynchronous


【解决方案1】:

你这样做:

async function someFunction() {
   const myResultFromAPromise = await functionThatReturnsAPromise();
   // ....do some stuff
   return myResultFromAPromise;
}

function someFunction() {
   return functionThatReturnsAPromise().then(function(myResultFromAPromise) {
      // ...do some stuff
      return myResultFromAPromise;
   });
}

但不要两者都做,这会非常混乱。

编辑:正如评论者指出的那样,您可以等待任何事情,但从您的代码中可以清楚地看出,您对async/await 的观点感到非常困惑

【讨论】:

  • 对于async/await 的新手来说,一个重要的调试区别是:在上面的第一个示例中,如果 promise 拒绝,则会在 someFunction 中抛出错误,而在第二个示例中,如果承诺拒绝将在名为 someFunction 的任何函数中抛出错误。
  • 我知道这甚至不是一个答案,但它太长了,不能成为评论,我只是试图将 OP 引导到尝试正确编写 async/await 代码的轨道上。它会做 OP(更不用说将来可能负责维护此代码的其他开发人员)按编写方式调试他们的代码是一种伤害。需要先清理干净。
  • 我只是想感谢大家的反馈,我最近在我的应用程序上得到了 QA 专家的一些帮助,我认为我的开发已经朝着更好 (TDD) 的方向发展。
猜你喜欢
  • 1970-01-01
  • 2017-07-12
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
相关资源
最近更新 更多