Javascript 在for循环的if语句中使用promise的resolve值
我有如下代码。实际函数是从API查询历史数据。例如,数组中的每个项都与一家公司相关,因此每次迭代都会返回关于该公司的历史数据。历史数据函数位于setTimeOut函数中,用于调节请求的数量,因为API在特定时间段内只允许特定数量的请求 每次你提出请求,你的津贴就会下降(这就是getRemainingAllowance承诺的目的。因此,如果剩余津贴低于2000,我试图打破这个循环 有没有一种方法可以在promise中返回解析值,以便在if语句中使用它来中断循环 我还尝试了result=resolvedValue(不带var)使其成为全局变量,但我仍然没有定义-我还了解到全局变量并不总是正确的方法)Javascript 在for循环的if语句中使用promise的resolve值,javascript,for-loop,promise,resolve,Javascript,For Loop,Promise,Resolve,我有如下代码。实际函数是从API查询历史数据。例如,数组中的每个项都与一家公司相关,因此每次迭代都会返回关于该公司的历史数据。历史数据函数位于setTimeOut函数中,用于调节请求的数量,因为API在特定时间段内只允许特定数量的请求 每次你提出请求,你的津贴就会下降(这就是getRemainingAllowance承诺的目的。因此,如果剩余津贴低于2000,我试图打破这个循环 有没有一种方法可以在promise中返回解析值,以便在if语句中使用它来中断循环 我还尝试了result=resolv
for(变量i=0;i{
var结果=resolvedValue
})
如果(结果<2000){
打破
}否则{
setTimeout(函数(){
getHistorical(arr[0]、arr[1]、arr[2]、arr[3]、arr[4]、arr[5])
},3000*(i+1))
}
}
我认为最好的方法是使用async/await,因为它更干净
async function doWork() {
for (var i = 0; i < 100; i++) {
const result = await getRemainingAllowance();
// use your returned value
}
}
异步函数doWork(){
对于(变量i=0;i<100;i++){
常量结果=等待getRemainingAllowance();
//使用您的返回值
}
}
你也可以用经典的承诺来实现,但这有点奇怪:
var counter = 0;
function doWork() {
getRemainingAllowance().then((result) => {
// process your result
counter++;
if (counter < 100) {
doWork(); // do it again until you hit the limit
}
});
}
var计数器=0;
函数doWork(){
getRemainingAllowance()。然后((结果)=>{
//处理你的结果
计数器++;
如果(计数器<100){
doWork();//再做一次,直到达到极限
}
});
}
我认为最好的方法是使用async/await,因为它更干净
async function doWork() {
for (var i = 0; i < 100; i++) {
const result = await getRemainingAllowance();
// use your returned value
}
}
异步函数doWork(){
对于(变量i=0;i<100;i++){
常量结果=等待getRemainingAllowance();
//使用您的返回值
}
}
你也可以用经典的承诺来实现,但这有点奇怪:
var counter = 0;
function doWork() {
getRemainingAllowance().then((result) => {
// process your result
counter++;
if (counter < 100) {
doWork(); // do it again until you hit the limit
}
});
}
var计数器=0;
函数doWork(){
getRemainingAllowance()。然后((结果)=>{
//处理你的结果
计数器++;
如果(计数器<100){
doWork();//再做一次,直到达到极限
}
});
}
首先,将require
语句移出循环体,然后,可以使用async wait
语法重新编写代码,如下所示。您也不需要setTimeout()
在请求之间添加延迟
for (var i = 0; i < arr.length; i++) {
const result = await getRemainingAllowance();
if (result < 2000) {
break;
} else {
historical.getHistoric(arr[0], arr[1], arr[2], arr[3], arr[4], arr[5])
await sleep(2); // delay of 2 seconds
}
}
请记住,
await
关键字只能在async
函数中使用。首先,将require
语句移出循环体,然后,可以使用async await
语法重新编写代码,如下所示。您也不需要setTimeout()
在请求之间添加延迟
for (var i = 0; i < arr.length; i++) {
const result = await getRemainingAllowance();
if (result < 2000) {
break;
} else {
historical.getHistoric(arr[0], arr[1], arr[2], arr[3], arr[4], arr[5])
await sleep(2); // delay of 2 seconds
}
}
请记住,
await
关键字只能在async
函数中使用。为什么不能使用async wait then?任何依赖于result
的代码都需要在then()
回调中,或者从内部调用。既然有一个for循环在arr
上迭代,为什么要在getHistoric
调用中使用它的前六个元素?为什么不能使用async wait then?依赖于result
的任何代码都需要在then()
回调中,或者从内部调用。既然您有一个在arr
上迭代的for循环,为什么要在getHistoric
调用中使用它的前六个元素呢?因为i
从未被使用过,所以我会使用在我看来更干净的for循环。我知道您选择了正常的for循环,因为它更接近问题,可能是OP的锚定点。因为从来没有使用过i
,我会使用看起来更干净的。我知道您选择了正常的for循环,因为它更接近问题,可能是OP的一个定位点。这个答案也有魅力,但另一个答案包括睡眠功能。这个答案也有魅力,但另一个答案包括睡眠功能