$.每个带有Ajax和变量修改
$.each with Ajax and Variable Modification
为什么whereString返回"where"而不是"where"+一些数据。我知道这与闭包和作用域有关,但我不确定如何解决它
感谢您提前提供的帮助。
这是代码:
function SomeFunction() {
var whereString = "where ";
var seperator = " ";
$.when.apply($(".SomeClass").each(function () {
var promise = SomeAjaxCall().done(function (data) {
whereString += seperator + data.d
});
seperator = "and "
}).then(function() {
alert("Finished");
alert(whereString); // Alerts "where " and not "Where "+data.d
})
};
注意,.apply()
希望this
上下文设置为第一个参数,数组设置为第二个参数;.each()
不返回数组,而且.each()
在Question的js
处似乎缺少右括号)
。
尝试将.map()
替换为.each()
,并将.get()
链接到.map()
以返回jQuery promise对象的数组,将$.when.apply
的context
:this
设置为$
。此外,在.map()
中包含return promise
,以将jQuery promise对象返回给.then()
。
function SomeFunction() {
var whereString = "where ";
var seperator = " ";
// set `this` to `jQuery` alias `$`
$.when.apply($, $(".SomeClass").map(function(i, el) {
// do ajax stuff
var promise = SomeAjaxCall().done(function (data) {
whereString += seperator + data.d
});
seperator = "and ";
// return jQuery promise object
return promise
// include closing parenthesis to `.map()` , use `.get()` to return
// array of jQuery promise objects
}).get()).then(function() {
alert("Finished");
alert(whereString);
})
};
function SomeFunction() {
var whereString = "where";
var seperator = " ";
// set `this` to `jQuery` alias `$`
$.when.apply($, $(".SomeClass").map(function(i, el) {
// do asynchronous stuff
var promise = $.Deferred().resolve({
"d": el.textContent
}).done(function(data) {
whereString += seperator + data.d
});
seperator = " and ";
// return jQuery promise
return promise
// include closing parenthesis to `.map()` , use `.get()` to return
// array of jQuery promise objects
}).get()).then(function() {
console.log("Finished");
console.log(whereString);
})
};
SomeFunction()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div class="SomeClass">abc</div>
<div class="SomeClass">def</div>
这是因为在对jquery select的所有结果调用"each"函数后,警报就会触发。然而,SomeAjaxCall()是异步的,因此,"done"函数还没有被调用,因为在"each"函数执行完毕时,ajax调用还没有完成,因此会触发警报。
虽然这最终可能不是你想要的,但你可以在发出警报之前添加几秒钟的超时,以查看"位置"最终是否会更新。
相关文章:
- 每次调用函数时,都要修改Javascript中的局部变量
- 修改传入变量到 JavaScript
- 在JavaScript中同时调用函数和修改变量
- 如何修改函数内部的全局变量
- 如果变量在使用它的块内被修改,则可以ng
- 在外部声明的变量和XMLHttpRequest中修改的变量的值在此Ajax请求之外不可见
- 修改函数以从类外部访问私有变量
- 修改作用域变量后,未更新作用域绑定
- 使用forEach修改角度范围变量
- 修改函数中的javascript变量
- C#WebBrowser控件-使用DOM创建和修改javascript变量,然后使用Applet读取它
- 在指令的链接函数中修改事件中的范围变量
- Javascript - 修改函数内的全局变量
- Ionic 2 从子页面修改 app.js 中的变量
- 如何使用 Uglify2 cli 修改顶级变量名称
- $.每个带有Ajax和变量修改
- Javascript:从局部变量修改全局变量
- Javascript变量修改后的最后一个值
- 根据服务变量修改CSS
- 目标转换问题-变量修改