如何向getJSON.then的响应处理函数传递额外参数?
给$.then的响应处理函数传递额外参数的几种方法
这问题我之前也碰到过,其实有几种直观的解决方案,结合你的代码给你一步步说明:
方法1:利用闭包捕获当前对象(兼容性最好)
在遍历数组的时候,每个匹配的对象都会被闭包"保留"下来,这样在$.then的回调里就能直接访问到这个对象,再传递给你的响应处理函数:
var letters = [ {name:"a", tag1:103, tag2:102}, {name:"b", tag1:3}, {name:"c", tag1:10}, {name:"d", tag1:11, tag2:14}, {name:"e", tag1:79, tag2:80}, {name:"f", tag1:23, tag2:17}, ]; // 修改你的处理函数,新增额外参数接收当前对象 function handleResponse(responseText, currentLetter) { console.log("接口响应内容:", responseText); console.log("当前匹配对象的name:", currentLetter.name); console.log("当前对象的tag1:", currentLetter.tag1); if (currentLetter.tag2) { console.log("当前对象的tag2:", currentLetter.tag2); } } // 遍历数组,指定匹配条件(比如匹配name为"a"和"d"的对象) letters.forEach(function(letter) { if (letter.name === "a" || letter.name === "d") { // 闭包会保留当前循环的letter对象 $.getJSON("你的请求URL") .then(function(response) { // 把响应和当前对象一起传给处理函数 handleResponse(response, letter); }); } });
方法2:使用Function.prototype.bind绑定参数
如果你想让代码更简洁,可以用bind把额外参数直接绑定到处理函数上,注意参数顺序要对应:
// 调整参数顺序,把额外参数放在前面(bind会把绑定的参数优先传入) function handleResponse(currentLetter, responseText) { console.log("当前匹配对象的name:", currentLetter.name); console.log("接口响应内容:", responseText); console.log("当前对象的tag1:", currentLetter.tag1); } letters.forEach(function(letter) { if (letter.name === "a" || letter.name === "d") { $.getJSON("你的请求URL") // 用bind绑定当前letter,null是指定this指向(这里不需要修改this) .then(handleResponse.bind(null, letter)); } });
方法3:ES6箭头函数(最简洁)
如果你的项目支持ES6语法,箭头函数会自动捕获外部作用域的变量,代码会更清爽:
// 处理函数保持方法1的参数顺序即可 function handleResponse(responseText, currentLetter) { console.log("接口响应内容:", responseText); console.log("当前匹配对象的name:", currentLetter.name); } letters.forEach(letter => { if (letter.name === "a" || letter.name === "d") { $.getJSON("你的请求URL") .then(response => handleResponse(response, letter)); } });
小提醒
- 不管用哪种方法,都要确保处理函数的参数顺序和你传递的顺序一致,避免参数错位。
- 如果请求URL需要用到当前对象的属性(比如
letter.name),直接在$.getJSON里拼接即可,比如$.getJSON("/api/data/" + letter.name)。
内容的提问来源于stack exchange,提问作者Sai
相关产品推荐
相关产品推荐

