React native Axios更新值超出该范围,以断开循环

React native Axios更新值超出该范围,以断开循环,react-native,axios,React Native,Axios,我目前仍在学习如何使用React Native 我想做的是将limit值更新为1,这样它将打破while循环,但我不确定如何执行它,因为我无法从Axios POST调用中的.then()内部更新该值。 如果有人能指出解决这个问题的方法,我很高兴。谢谢你的帮助 var limit = 0; while (limit == 0) { running = running + 20; console.log("restart")

我目前仍在学习如何使用React Native

我想做的是将limit值更新为1,这样它将打破while循环,但我不确定如何执行它,因为我无法从Axios POST调用中的.then()内部更新该值。 如果有人能指出解决这个问题的方法,我很高兴。谢谢你的帮助

var limit = 0;
        while (limit == 0) {
          running = running + 20;
          console.log("restart");
          postDataCalories = {
            "query": `${running} minutes run and ${walking} minutes walking`,
            "gender":"male",
            // "nf_calories": 363.62,
            "weight_kg":63.5,
            "height_cm":167.64,
            "age":30
          };
          console.log(`${running} minutes run and ${walking} minutes walking`);
          axios.post('https://trackapi.nutritionix.com/v2/natural/exercise', postDataCalories, axiosConfig2)
          .then((res3) => {
            console.log("exercise RESPONSE RECEIVED: ", res3);
            let caloriesFood = res2.data.foods[0].nf_calories;
            let caloriesExercise = res3.data.exercises[0].nf_calories;
            let caloriesDifferences = caloriesFood - caloriesExercise;
            console.log("hi " + caloriesDifferences);
            if (caloriesDifferences < 50){
              console.log('done');
              limit = 1;
            } else {
              console.log('nope');
            }
          })
        }
var限制=0;
while(limit==0){
运行=运行+20;
console.log(“重启”);
PostDataCarries={
“查询”:“${running}分钟跑步和${walking}分钟步行”,
“性别”:“男性”,
//“nf_卡路里”:363.62,
“重量”_kg:63.5,
“高度_cm”:167.64,
“年龄”:30岁
};
log(`running}minutes run和${walking}minutes walking`);
轴心柱https://trackapi.nutritionix.com/v2/natural/exercise,PostDataCarries,axiosConfig2)
。然后((res3)=>{
日志(“收到的练习响应:”,res3);
让卡路里食物=res2.data.foods[0].nf_卡路里;
let caloriesExercise=res3.data.exercises[0].nf\u卡路里;
让热量差异=热量食物-热量锻炼;
console.log(“hi”+热量差);
if(热量差<50){
console.log('done');
限值=1;
}否则{
console.log('nope');
}
})
}

这在您的情况下是正确的,您不能中断then函数中的while循环,因为该函数在不同的时间被调用(他们称之为异步)

你可以做两件事。如果您有权在您的环境中访问wait/async,则可以将其重写为:

async someFunction() { 
        var limit = 0;
        var running = 1;  // arbitrarily start at 1.
        while (limit == 0) {
          running = running + 20;
          console.log("restart running " + running);
          postDataCalories = {
            "query": `${running} minutes run and ${walking} minutes walking`,
            "gender":"male",
            // "nf_calories": 363.62,
            "weight_kg":63.5,
            "height_cm":167.64,
            "age":30
          };
          console.log(`${running} minutes run and ${walking} minutes walking`);
          var res3 = await axios.post('https://trackapi.nutritionix.com/v2/natural/exercise', postDataCalories, axiosConfig2)

            console.log("exercise RESPONSE RECEIVED: ", res3);
            let caloriesFood = res2.data.foods[0].nf_calories;
            let caloriesExercise = res3.data.exercises[0].nf_calories;
            let caloriesDifferences = caloriesFood - caloriesExercise;
            console.log("hi " + caloriesDifferences);
            if (caloriesDifferences < 50){
              console.log('done');
              limit = 1;
              // you may also do:
              break;
            } else {
              console.log('nope');
            }
          }
        }
}
async someFunction(){
var限值=0;
var running=1;//任意从1开始。
while(limit==0){
运行=运行+20;
console.log(“重启运行”+运行);
PostDataCarries={
“查询”:“${running}分钟跑步和${walking}分钟步行”,
“性别”:“男性”,
//“nf_卡路里”:363.62,
“重量”_kg:63.5,
“高度_cm”:167.64,
“年龄”:30岁
};
log(`running}minutes run和${walking}minutes walking`);
var res3=等待axios.post('https://trackapi.nutritionix.com/v2/natural/exercise,PostDataCarries,axiosConfig2)
日志(“收到的练习响应:”,res3);
让卡路里食物=res2.data.foods[0].nf_卡路里;
let caloriesExercise=res3.data.exercises[0].nf\u卡路里;
让热量差异=热量食物-热量锻炼;
console.log(“hi”+热量差);
if(热量差<50){
console.log('done');
限值=1;
//你也可以这样做:
打破
}否则{
console.log('nope');
}
}
}
}
在通常的网络环境下,它需要一个现代浏览器(Firefox/Chrome)(或者当你有babel/regenerator运行时,也许你的设置已经能够传输/运行这个了。)

如果您无法访问async/await,则需要应用递归(以解决同步性问题)。通常,您可以按顺序执行任务(一行、一步一步、使用while循环),现在您可以编写如下内容:

function runTheLoop(running, walking) {
          postDataCalories = {
            "query": `${running} minutes run and ${walking} minutes walking`,
            "gender":"male",
            // "nf_calories": 363.62,
            "weight_kg":63.5,
            "height_cm":167.64,
            "age":30
          };
          console.log(`${running} minutes run and ${walking} minutes walking`);
          axios.post('https://trackapi.nutritionix.com/v2/natural/exercise', postDataCalories, axiosConfig2)
          .then((res3) => {
            console.log("exercise RESPONSE RECEIVED: ", res3);
            let caloriesFood = res2.data.foods[0].nf_calories;
            let caloriesExercise = res3.data.exercises[0].nf_calories;
            let caloriesDifferences = caloriesFood - caloriesExercise;
            console.log("hi " + caloriesDifferences);
            if (caloriesDifferences < 50){
              console.log('done');
              // limit = 1;
              return;
            } else {
              console.log('nope');
 
              // This is the recursive variant of "running the loop again"
              return runTheLoop(running + 20, walking + 20);
            }
          })
        }
    }


// Somewhere:
console.log("restart");
// one minute of walking and one minute of running.
runTheLoop(1, 1);

函数runTheLoop(运行、行走){
PostDataCarries={
“查询”:“${running}分钟跑步和${walking}分钟步行”,
“性别”:“男性”,
//“nf_卡路里”:363.62,
“重量”_kg:63.5,
“高度_cm”:167.64,
“年龄”:30岁
};
log(`running}minutes run和${walking}minutes walking`);
轴心柱https://trackapi.nutritionix.com/v2/natural/exercise,PostDataCarries,axiosConfig2)
。然后((res3)=>{
日志(“收到的练习响应:”,res3);
让卡路里食物=res2.data.foods[0].nf_卡路里;
let caloriesExercise=res3.data.exercises[0].nf\u卡路里;
让热量差异=热量食物-热量锻炼;
console.log(“hi”+热量差);
if(热量差<50){
console.log('done');
//限值=1;
返回;
}否则{
console.log('nope');
//这是“再次运行循环”的递归变体
返回runTheLoop(跑步+20,步行+20);
}
})
}
}
//某处:
console.log(“重启”);
//一分钟的步行和一分钟的跑步。
runTheLoop(1,1);

注意:我使用了您的代码,使示例与您的情况相关,我自己无法测试,因此如果您复制并粘贴此代码,可能无法直接工作。

您好!谢谢你和我分享你的工作方法,先生。我确实尝试了async Wait备选方案,但似乎限制仍然无法打破循环,而且它一直在继续。我有一个问题,我是否能够更新“如果(卡路里差异<50)”声明下的跑步值?因为我似乎无法做到这一点,因为当我console.log该值时没有任何更改@约书亚:如果它继续按顺序进行(一个接一个),那么我们就非常接近了!是的,您可以更改running变量,但是我怀疑在每个循环上running应该增加20,如果不是这样的话,那么我们可能做错了什么。您可以做的另一件事是,您也可以使用'break;'陈述我将更新代码示例以显示它。事实上,我确实是通过使用async/await方法来实现的。非常感谢。