Javascript $。每个都带有Ajax和变量修改
whereString为什么返回“where”而不是“where”+一些数据。我知道这与闭包和作用域有关,但我不知道如何解决它 提前谢谢你的帮助 代码如下:Javascript $。每个都带有Ajax和变量修改,javascript,jquery,ajax,closures,Javascript,Jquery,Ajax,Closures,whereString为什么返回“where”而不是“where”+一些数据。我知道这与闭包和作用域有关,但我不知道如何解决它 提前谢谢你的帮助 代码如下: function SomeFunction() { var whereString = "where "; var seperator = " "; $.when.apply($(".SomeClass").each(function () { var p
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
})
};
这是因为警报是在对jquery select的所有结果调用“each”函数之后触发的。但是,SomeAjaxCall()是异步的,因此没有调用“done”函数,因为在“each”函数执行完毕之前,ajax调用没有完成,因此警报会触发 虽然这可能不是您最终想要的,但您可以在发出警报之前添加几秒钟的超时时间,以查看“where”最终是否会得到更新。注意,
.apply()
希望将此
上下文设置为第一个参数,将数组设置为第二个参数.each()
不返回数组,而且。each()
似乎缺少右括号)
atjs
在问题中
尝试将.map()
替换为.each()
,使用.get()
链接到.map()
以返回jQuery承诺对象数组,设置上下文
:此
的$。何时将应用到$
。另外,在.map()中包含返回承诺
,以将jQuery承诺对象返回到.then()
function SomeFunction(){
var whereString=“where”;
var分隔符=”;
//将`this`设置为`jQuery`别名`$`
$.when.apply($,$(“.SomeClass”).map(函数(i,el){
//做异步的事情
var promise=$.Deferred().resolve({
“d”:el.textContent
}).完成(功能(数据){
其中string+=分隔符+数据.d
});
分隔符=“和”;
//返回jQuery承诺
回报承诺
//在“.map()”中包含右括号,使用“.get()”返回
//jQuery承诺对象数组
}).get())。然后(函数(){
控制台日志(“完成”);
console.log(whereString);
})
};
SomeFunction()
abc
def
谢谢,这很有帮助。我是JS的新手,我通过尊重和承诺工作。
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);
})
};