【问题标题】:Can I return or resolve a promise in a .then in javascript我可以在 .then 中返回或解决 javascript 中的承诺吗
【发布时间】:2021-03-07 21:18:28
【问题描述】:

我希望包装函数返回 .then 里面的值,这样我以后可以使用它。

我有以下代码,其中我首先有一个返回承诺的请求函数,然后我有一个位于它周围并调用请求函数的 statusCurrent 函数包装器。我能够在请求的 .then 中获取值,但我需要在状态 Current 函数中返回它。我尝试了很多解决方案,但都被卡住了。

这是我正在安慰我被困在的数据的最后。

这是我的代码。我对 Promise 不是很熟悉,因此我们将不胜感激。

function request(opts) {
  return new Promise(function (resolve, reject) {
    https
      .request(opts, function (res) {
        res.pipe(process.stdout);
        res.setEncoding("utf8");
        let body = "";
        res.on("data", (chunk) => (body += chunk));
        res.on("end", () => {
          //console.log("test1")
          //console.log(body);
          let json = JSON.parse(body);
          test = json.state;
          //console.log("test")
          resolve(json.state);
        });
      })
      .end(opts.body || "");
  });
}

function statusCurrent() {
  return new Promise(function (resolve, reject) {
    request(
      aws4.sign(
        {
          hostname: "-ats.iot.us-east-1.amazonaws.com",
          service: "iotdata",
          region: "us-east-1",
          method: "GET",
          path: "/things/esp8266_7F3B95/shadow",
          headers: {
            "Content-Type": "application/json0",
          },
        },
        {
          secretAccessKey: "",
          accessKeyId: "",
        }
      )
    ).then(function (val) {
      //console.log("val")
      //console.log(val)
      // THIS CONSOLES THE VALUE CORRECTLY
      resolve(val);
    });
  });
}

const LaunchRequestHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === "LaunchRequest";
  },
  handle(handlerInput) {
    const speakOutput = `You're current status is`;

    statusCurrent().then(function (data) {
      console.log(data);
      //THIS CURRENTLY CONSOLES NOTHING
      console.log("data");
    });

    return handlerInput.responseBuilder.speak(speakOutput).getResponse();
  },
};


【问题讨论】:

  • 我知道这不是一个有用的答案,但 request 已被弃用,考虑使用原生处理 promise 的包,我建议得到:npmjs.com/package/got 而不是 request。
  • 好的,我肯定会考虑搬家,但我想先让我的功能发挥作用,我不觉得我离得很远。
  • 是否有办法使用 aws4 iam 身份验证。你知道一个最小的例子吗?一开始工作就很头疼

标签: javascript asynchronous https promise return


【解决方案1】:

您听说过异步/等待操作吗?它们让你写的 Promise 更清晰

async function statusCurrent() {
   const awsResult = await aws4.sign(
    {
      hostname: "-ats.iot.us-east-1.amazonaws.com",
      service: "iotdata",
      region: "us-east-1",
      method: "GET",
      path: "/things/esp8266_7F3B95/shadow",
      headers: {
        "Content-Type": "application/json0",
      },
    },
    {
      secretAccessKey: "",
      accessKeyId: "",
    }
  )
  const requestResult = await request(awsResult)
  return requestResult
}

变量 awsResult 包含 aws.sign 的 promise 解析为的值,而 requestResult 包含 request 的 promise 解析为的值

【讨论】:

  • 如何获取 LaunchRequestHandler 函数中的值 我只返回了一个 asnyc/await 函数。我试过了 。然后也有。我是否需要使 lantchRequest 异步并在那里等待
  • 我也一直在等待 async/await 但从未真正理解它。我想我现在有点把握了。谢谢。及其工作
  • await request(awsResult) 没有意义。只需return request(awsResult) 即可避免额外的承诺。
  • 只需将 LaunchRequestHandler 函数设为异步,您就可以在其中等待 Promise。阅读 async/await,它比 .then 方法更容易维护
  • @ggorlen 他们都返回相同的东西,所以没关系
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2015-02-07
  • 2023-03-15
  • 2017-07-11
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
相关资源
最近更新 更多