【发布时间】:2020-02-17 10:53:10
【问题描述】:
我是 node 和 promise 的新手,因此我们将不胜感激!
我正在尝试:
- 从 API 获取访问令牌
- 将访问令牌发送到 URL 的同一 API
- 轮询 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