【发布时间】:2018-04-10 11:09:59
【问题描述】:
我有一个在“then”函数内部调用的异步函数“doApiRequest”...
doSomething()
.then(() => {
return doApiRequest();
})
.then((apiResult) => {
doSomethingElse(apiResult);
});
问题在于 doApiRequest 返回一个带有该 API 请求最终结果的 Promise。但是,根据我正在使用的 API 的性质,存在请求速率限制。我计划通过让每个 API 请求将自身添加到队列中来处理这个问题,然后当队列在等待速率限制后释放请求时,API 请求将完成解析。 虽然我可以做类似...
doSomething()
.then(() => {
return waitForRateRefresh();
})
.then(() => {
return doApiRequest();
})
.then((apiResult) => {
doSomethingElse(apiResult);
});
我可能最终会收到很多“doApiRequest”调用,因此必须在每个调用上都链接一个“waitForRateRefresh”似乎是一个不好的方法,我还必须让它工作,以便它可以传递来自之前的 then 语句的数据.我想做的是在“doApiRequest”本身内部处理这个问题。
'doApiRequest' 看起来像这样
doApiRequest(){
return new Promise((resolve, reject) => {
waitForRateRefresh().then(() => {
//http call
resolve(someValue);
};
});
}
但是我正在尝试找到一种不涉及嵌套 Promise 的方法。还有什么其他方法可以解决这个问题。我这样做的另一种方法是使用 Async/Await 代替,有没有其他方法可以只用承诺来做到这一点?从 'doApiRequest' 中返回带有 then 函数的 Promise 会发生什么(或者甚至可能)...
return waitForRateRefresh().then(() => new Promise(..../http call));
在调用 'doApiRequest' 的原始 then 函数中 - 它会接收 'waitForRateRefresh' 返回的值,还是向下遍历附加到它的 then 链的结果。
感谢您的任何见解
【问题讨论】:
-
注意:
'doApiRequest' would look something like this避免使用承诺构造函数反模式...该函数的内容只是return waitForRateRefresh().then(() => { //http call return someValue; }; -
看到你
.then(() => { return waitForRateRefresh(); })和doApiRequest一样......无论如何都没有传入的“价值” -
@JaromandaX 绝对是,在这种情况下,虽然 'someValue' 会使其成为原始 then 语句,或者只会返回 waitForRateRefresh 解析为的内容
-
这很有帮助,尤其是能够包装它。我在这里创建了一个 JSBin 来测试一些不同的方法并返回值jsbin.com/dawesen/edit?js,console
标签: javascript node.js promise async-await