Mr.*_*ith 4 javascript jquery post loops
我有以下代码:
for (_field in _fields) {
$.post(
'/api/fields',
{ id: _field.id },
function(data, _field) {
alert(data);
} (data, _fields[_field)
);
}
Run Code Online (Sandbox Code Playgroud)
我必须将_fields[_field]元素传递给从jQuery返回数据的函数,因为在循环期间丢失了对正确对象的引用.问题是,在定义post函数应该有一个_field参数时,您还必须为数据指定一个参数,否则数据将被覆盖_field.
目前数据返回,undefined因为我没有在循环内定义数据对象.我也试过传入null,但这也只是回归null.我正在寻找一种方法来传递元素而不会覆盖从post函数返回的数据.
有没有办法解决这个问题,或者是否有一种替代的jQuery方法可以满足需要?
您需要一个函数工厂函数 - 一个创建函数的函数:
for (_fieldName in _fields) {
$.post('/api/fields',
{
// Unrelated, but I think this bit is wrong; shouldn't it be
// `id: _fields[_fieldName].id` ? You're trying to use `.id` on
// a string -- see below for a full update
id: _fieldName.id
},
makeHandler(_fields[_fieldName])
);
}
function makeHandler(field) {
return function(data) {
// Use `data` and `field` here
};
}
Run Code Online (Sandbox Code Playgroud)
请注意,在我们传入的对象初始值设定项中$.post,我们调用 makeHandler它运行并返回我们将传入的函数$.post.然后,该函数被调用时$.post完成,并已获得了data这样的说法$.post给它还有field一个参数makeHandler,因为它是一个封闭在呼吁的背景下makeHandler,包括field说法.更多:关闭并不复杂
请注意,在上面的代码,我改变了你的变量_field,以_fieldName更清晰:在变量for..in的循环是一个字符串,该名称的属性.另见评论,我认为你试图.id在错误的地方使用.这是我认为你真正想要的:
for (_fieldName in _fields) {
_field = _fields[_fieldName];
$.post('/api/fields',
{
id: _field.id
},
makeHandler(_field)
);
}
function makeHandler(field) {
return function(data) {
// Use `data` and `field` here
};
}
Run Code Online (Sandbox Code Playgroud)
另请注意,如果_fields是数组,则不应for..in在没有安全措施的情况下使用它.更多:神话和现实for..in