我正在使用某些软件的JavaScript API。在软件中有解决方案,它们包含工作清单。
对于每个解决方案,我想列出工作清单。
solutions = obtainSolutionsformAPI();
for (i=0,i<solutions.length,i++){
sol=solutions[i];
sol.obtainWorklists(callbackFunction);
}
callbackFunction由软件调用,工作列表数组作为参数传递。
function callbackFunction(arrayOfWorkLists){
for (j=0,j<arrayOfWorkLists.length,j++){
wl=arrayOfWorkLists[j];
console.log(wl);
}
}
现在在console.log中我想将每个工作清单中的i
变量(解决方案的数量)打印出来,但是如何获取i
内部回调函数,当我我不是那个叫它的人吗?我怀疑每次将其传递给sol.obtainWorklists(callbackFunction);
之前我都需要修改回调函数。这样做的正确方法是什么?
编辑:我不希望函数定义嵌套(一个在其他内部),因为我有多个这样的嵌套,它将是非常难以理解的。所以我不想要这个:
sol.obtainWorklists(function callbackFunction(arrayOfWorkLists){...});
答案 0 :(得分:2)
你需要使用一个闭包:
solutions = obtainSolutionsformAPI();
for (i=0,i<solutions.length,i++){
(function(innerI) {
sol=solutions[innerI];
sol.obtainWorklists(function(worklists) {
callbackFunction(worklists, innerI);
}
})(i);
}
function callbackFunction(arrayOfWorkLists, i){
console.log(i);
for (j=0,j<arrayOfWorkLists.length,j++){
wl=arrayOfWorkLists[j];
console.log(wl);
}
}
答案 1 :(得分:2)
您可以使用构建器功能:
sol.obtainWorklists(buildCallback(i, callbackFunction));
... buildCallback
看起来像这样:
function buildCallback(index, func) {
return function() {
var args = [index];
args.push.apply(args, arguments);
func.apply(this, args);
};
}
完整示例
然后在你的回调中,期望i
值作为第一个参数,其中obtainWorklists
通常在其后面提供参数。
如何运作:
buildCallback
时,您会传递i
值和您想要的回叫。buildCallback
返回一个新函数,该函数绑定了该函数(它是对index
和func
参数的闭包 1}})。buildCallback
调用创建的函数obtainWorklists
时,我们创建一个带有buildCallback
值(i
)的数组,后跟从{{1}收到的参数}。index
值和obtainWorklists
数组;您的回调会将this
中的条目视为离散参数。如果您不关心回调中的args
值,则可以改为使用ES5的args
:
this
这做了很多相同的事情,但不保留用于调用它的Function#bind
。
构建器函数的完整示例(live copy):
sol.obtainWorklists(callbackFunction.bind(null, i));
this
(live copy)的完整示例:
// obtainWorklists stand-in
function obtainWorklists(func) {
setTimeout(function() {
// Just call it with a random number
func(rand(100, 200));
}, rand(100, 500));
}
// Code to get worklists
var i;
for (i = 0; i < 10; ++i) {
obtainWorklists(buildCallback(i, callback));
}
function buildCallback(index, func) {
return function() {
var args = [index];
args.push.apply(args, arguments);
func.apply(this, args);
};
}
// Your callback
function callback(index, value) {
display("Index is " + index + ", value is " + value);
}
// ========= Utility functions
function rand(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}