ming159 最近回复了
推荐部黑帮英剧吧,但是贼帅 <浴血黑帮>
fucking shelby !
生气无用 !!!
处理方法也很简单. 正式开发前, 书面形式做出功能规划,抄送相关领导. 让他正式邮件确认. 哪里不行改哪里. 最后他甩锅的时候. 理直气壮的说: "当时功能设计,是我们共同讨论一致通过的,现在有分歧可以再改,而不是在这里事后诸葛亮"
确实是异步导致的问题。 但还有其他问题。
1. post 函数是个异步函数
2. for 循环是同步。
3. JS 变量作用域+JS 函数传值都是值传递、
另外补充一点,**JS 只在一个线程上运行**,异步函数是被放到了任务队列中,等待主线程调用的。
所以,原先在 for 循环内部的时候。 执行顺序是 先执行完 for 循环。 然后执行 post 函数( post 函数)。所以当 post 函数执行的时候。url 每次都是数组的最后一个值。 你的情况类似如下
```
console.log("1"); // 主线程
setTimeout(function(){
console.log("2");
},0); // 加入到了 任务队列。
console.log("3");// 主线程
// 又或者
for(var i=0;i<5;i++){
setTimeout(function(){
console.log("变量 i="+i);
},0);
}
```
那么 为什么提取成函数 for 循环内调用就行了。
在 ES6 之前的,JS 是没有块级作用域变量的,也就是 后来为啥引入 let 的原因。 也就是说,在原来 for 循环内部的时候,post 执行时访问的都是同一个变量 i 。但是提成函数时,变量 i 的值被当做函数参数传入函数内。 那么每次 post 的时候,是从函数参数中获取到的。就不是原先 for 循环中定义的 i 了。
所以 前面的兄弟提到,可以用 let 代替 var 也能解决你的问题。是因为 let 定义的是块级作用域。 比如你可以测试一下如下程序
```
// var 定义 i
for(**var** i=0;i<5;i++){
setTimeout(function(){
console.log(i);
},0);
}
// let 定义
for(**let** i=0;i<5;i++){
setTimeout(function(){
console.log(i);
},0);
}
```
不知道为啥,我脑海中蹦出来的是,癌症之后,出去游玩. 最后钱花光,癌症好了的 新闻
不是建议去效仿啊. 但有一点就是 要保持 **开心**
放下恐惧,做点能让自己**开心**的事. 奇迹会发生的
循环内部改造成函数调用就行了.....
`
var allimg = 获取到的图片数组;
var oldcontent = 原内容;
for(var i=0; i<allimg.length; i++){
var url = allimg[i]
doReplace(url); // 函数调用传值作用域会改变
}
function doReplace(url){
$.post('url', 参数, function(ret) {
if(ret['code'] == 200) {
oldcontent = oldcontent.replace(ret['oldimgurl'], ret['newimgurl']);
}else{
console.log(错误信息);
}
}, 'json');
}
`
补充一下,纯粹个人极其强烈的偏见.
1. 首先你跟 前前男友有矛盾 的时候,为啥找他倾诉? 没有同性闺蜜吗?
2. 你答应人家回国一起玩,中途遇到新的男生就接受了 .说明 你也没那么看重他
合理怀疑一下: 现在是不是没有"新鲜"男生追你了. 所以想起 他了?
有一点可以祝福的是, 不管是他,还是 OP,都会遇到自己对的人.
广汉 三星堆
成都市内 金沙博物馆. 强烈推荐.
青城山,建议一天 .
都江堰 可以和成都市内拼 一天. 因为都江堰山上可以爬爬,山后的 西街 也还可以.
要想系统性了解,可以看 计算机图形 相关书籍.例如 OpenGL