【问题标题】:Why does my promise chain run concurrently, not sequentially为什么我的承诺链是同时运行的,而不是顺序运行的
【发布时间】:2020-02-17 10:53:10
【问题描述】:

我是 node 和 promise 的新手,因此我们将不胜感激!

我正在尝试:

  1. 从 API 获取访问令牌
  2. 将访问令牌发送到 URL 的同一 API
  3. 轮询 URL 以获取一些数据

我认为执行此操作的明智方法是使用承诺链(请注意,我尚未实施轮询,我现在只是在执行此操作时每隔一段时间使用 console.log。请求主体也不是t 包括在下面,但不是问题):

const request = require('request');

// get access token
new Promise((resolve, reject) => {
  request.post({
    json_request
  }, (error, response, body) => {
    if (error) console.error(error);
    console.log("got access token"));
    resolve(JSON.parse(body).accessToken);
  });
})

// use access token to get url
.then(
  (accessToken) => {
    request.post({
      json_request_with_access_token
    }, (error, response, body) => {
      if (error) console.error(error);
      console.log("got URL");
      return JSON.parse(body).url;
    })
  }
)

// Poll URL
.then(
  (reportURL) => {
    console.log("I'm here!");
    setInterval(() => {
     console.log("Report URL: ".concat(reportURL));
    }, 10000);    // setInterval waiting time
  }
)

问题是链中的最后一个 Promise 在中间的 Promise 完成之前运行。所以控制台的输出是:

got access token
I'm here!
got URL
report URL: undefined

如果“我在这里!”在“获取 URL”之前打印,然后在第二个承诺运行时,代码必须继续执行最后一个承诺。问题是它还没有 URL。我不明白如何一个接一个地运行这些,而不是同时运行。我尝试将这三个 promise 放入 3 个单独的函数中,然后将它们包装在一个 async main() 函数中,其中

async function main() {
  let accessToken = await getAccessToken();
  let url = await getURL(accessToken);
  await pollReport(url);
}

但这有同样的错误。有谁知道如何解决这一问题?我在某处犯了基本错误吗?任何帮助将非常感激!

【问题讨论】:

  • 问题是,你的代码不是很干净。始终检查您是否有相同数量的左括号和右括号。这可以解释为什么您的“.then”同时执行,因为您实际上并没有链接它们。
  • 你说得对。我刚刚检查了原始代码,它很好,这只是将实际请求 json 简化为 'json_request' 以导致堆栈溢出的错误,并且我弄乱了括号。可悲的是不是问题

标签: node.js concurrency promise async-await


【解决方案1】:

您的部分// use access token to get url 和最后一部分没有返回承诺。这是一个回调,它不返回承诺。你需要把它包装在new Promise中。

我强烈建议从 request 包中移出,因为它现在已被弃用。使用一些内置支持 Promise 的现代包,也会让你的生活更轻松。比如gotaxios等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多