Javascript 在for循环的if语句中使用promise的resolve值

Javascript 在for循环的if语句中使用promise的resolve值,javascript,for-loop,promise,resolve,Javascript,For Loop,Promise,Resolve,我有如下代码。实际函数是从API查询历史数据。例如,数组中的每个项都与一家公司相关,因此每次迭代都会返回关于该公司的历史数据。历史数据函数位于setTimeOut函数中,用于调节请求的数量,因为API在特定时间段内只允许特定数量的请求 每次你提出请求,你的津贴就会下降(这就是getRemainingAllowance承诺的目的。因此,如果剩余津贴低于2000,我试图打破这个循环 有没有一种方法可以在promise中返回解析值,以便在if语句中使用它来中断循环 我还尝试了result=resolv

我有如下代码。实际函数是从API查询历史数据。例如,数组中的每个项都与一家公司相关,因此每次迭代都会返回关于该公司的历史数据。历史数据函数位于setTimeOut函数中,用于调节请求的数量,因为API在特定时间段内只允许特定数量的请求

每次你提出请求,你的津贴就会下降(这就是getRemainingAllowance承诺的目的。因此,如果剩余津贴低于2000,我试图打破这个循环

有没有一种方法可以在promise中返回解析值,以便在if语句中使用它来中断循环

我还尝试了result=resolvedValue(不带var)使其成为全局变量,但我仍然没有定义-我还了解到全局变量并不总是正确的方法)

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的一个定位点。这个答案也有魅力,但另一个答案包括睡眠功能。这个答案也有魅力,但另一个答案包括睡眠功能