为什么whereString返回"其中"而不是"其中" +一些数据。我知道这有封闭和范围,但我不知道如何解决它。
提前感谢您的帮助。
以下是代码:
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
})
};
答案 0 :(得分:0)
这是因为警报是在你的每个人之后发出的。已经在jquery select的所有结果上调用了函数。但是,SomeAjaxCall()是异步的,因此,'已完成'函数的召唤是因为ajax调用是在每个'每个'之前完成的。功能完成执行,因此警报触发。
虽然最终可能不是您想要的,但您可以在发出警报之前添加几秒钟的超时时间,以便查看'其中'最终会更新。
答案 1 :(得分:0)
注意,.apply()
期望将this
上下文设置为第一个参数,将数组设置为第二个参数; .each()
未返回数组,.each()
似乎在问题)
处缺少右括号js
。
尝试将.map()
替换为.each()
,.get()
链接到.map()
以返回jQuery保证对象数组,设置context
:this
$.when.apply
至$
。另外,在return promise
中包含.map()
以将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>