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
Node.js 为什么我的承诺链同时运行,而不是按顺序运行_Node.js_Concurrency_Promise_Async Await - Fatal编程技术网

Node.js 为什么我的承诺链同时运行,而不是按顺序运行

Node.js 为什么我的承诺链同时运行,而不是按顺序运行,node.js,concurrency,promise,async-await,Node.js,Concurrency,Promise,Async Await,我是新的节点和承诺,所以任何帮助将不胜感激 我正试图: 从API获取访问令牌 将访问令牌发送到URL的同一API 轮询URL以获取某些数据 我认为实现这一点的明智方法应该是一个承诺链(注意,我还没有实现轮询,我现在只是每隔一段时间执行一次console.log,而我正在进行此操作。此外,下面不包括请求主体,但这不是问题): 问题是,链条中的最后一个承诺在中间一个承诺完成之前就已经运行了。因此,控制台的输出为: got access token I'm here! got URL report U

我是新的节点和承诺,所以任何帮助将不胜感激

我正试图:

  • 从API获取访问令牌
  • 将访问令牌发送到URL的同一API
  • 轮询URL以获取某些数据
  • 我认为实现这一点的明智方法应该是一个承诺链(注意,我还没有实现轮询,我现在只是每隔一段时间执行一次console.log,而我正在进行此操作。此外,下面不包括请求主体,但这不是问题):

    问题是,链条中的最后一个承诺在中间一个承诺完成之前就已经运行了。因此,控制台的输出为:

    got access token
    I'm here!
    got URL
    report URL: undefined
    
    如果在“获取URL”之前打印“我在这里”,那么在第二个承诺运行时,代码必须转到最后一个承诺。问题是它还没有URL。我不明白如何一个接一个地运行这些,而不是同时运行。我尝试将这三个承诺分成3个单独的函数,然后将它们包装到一个异步main()函数中,其中

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

    但这也有同样的错误。有人知道如何解决这个问题吗?我在什么地方犯了一个基本的错误吗?任何帮助都将不胜感激

    您的节
    //使用访问令牌获取url
    ,最后一节不会返回承诺。这是当时的一次回调,它不会返回承诺。您需要将其包装在
    newpromise


    我强烈建议您离开
    请求
    包,因为它现在已被取消。使用一些modenr day软件包,它内置了对承诺的支持,也会让你的生活更轻松。比如
    got
    axios
    等等。

    问题是,你的代码不是很干净。始终检查是否有相同数量的左括号和右括号。这就解释了为什么你的“.then”同时起作用,因为你并没有把它们链接起来。你完全正确。我刚刚检查了原始代码,没有问题,只是将实际的请求json简化为“json_request”导致堆栈溢出时出现了一个错误,我把括号搞乱了。遗憾的是,这不是问题所在
    async function main() {
      let accessToken = await getAccessToken();
      let url = await getURL(accessToken);
      await pollReport(url);
    }