javascript回调函数的泛化
我想创建大约10个XML HTTP请求,如下所示。我想将javascript回调函数的泛化,javascript,windows-8,callback,Javascript,Windows 8,Callback,我想创建大约10个XML HTTP请求,如下所示。我想将I的值用于第一个“children”引用,但由于I在执行回调之前发生了更改,因此I的值与“results”选项卡中获取的url不匹配。我怎样才能概括这一点 var i = 1; WinJS.xhr({ url: root.results[i].profile_image_url_https, responseType: 'blob' }).done(function (result) { var imgTag = t
I
的值用于第一个“children”引用,但由于I
在执行回调之前发生了更改,因此I
的值与“results”选项卡中获取的url不匹配。我怎样才能概括这一点
var i = 1;
WinJS.xhr({
url: root.results[i].profile_image_url_https,
responseType: 'blob'
}).done(function (result) {
var imgTag = theDiv.children[1].children[0];
var imageBlob = URL.createObjectURL(result.response, {
oneTimeOnly: true
});
imgTag.src = imageBlob; //tempLocalUrl;
});
i = 2;
WinJS.xhr({
url: root.results[i].profile_image_url_https,
responseType: 'blob'
}).done(function (result) {
var imgTag = theDiv.children[2].children[0];
var imageBlob = URL.createObjectURL(result.response, {
oneTimeOnly: true
});
imgTag.src = imageBlob; //tempLocalUrl;
});
可以在回调函数中增加i的值。这样,它在使用后才会增加
var i = 1;
WinJS.xhr({
url: root.results[i].profile_image_url_https,
responseType: 'blob'
}).done(function (result) {
var imgTag = theDiv.children[1].children[0];
var imageBlob = URL.createObjectURL(result.response, {
oneTimeOnly: true
});
imgTag.src = imageBlob; //tempLocalUrl;
i++;
});
一般来说,你可以做两件事
WinJS.xhr
的argumentobject{}
中,没有复制变量的范围,因此我将使用选项1:
var i = 1;
WinJS.xhr({
url: root.results[ return function(i) { return i; }(i) ].profile_image_url_https,
responseType: 'blob'
}).done(function (result) {
var imgTag = theDiv.children[1].children[0];
var imageBlob = URL.createObjectURL(result.response, {
oneTimeOnly: true
});
imgTag.src = imageBlob; //tempLocalUrl;
});
i = 2;
WinJS.xhr({
url: root.results[ return function(i) { return i; }(i) ].profile_image_url_https,
responseType: 'blob'
}).done(function (result) {
var imgTag = theDiv.children[2].children[0];
var imageBlob = URL.createObjectURL(result.response, {
oneTimeOnly: true
});
imgTag.src = imageBlob; //tempLocalUrl;
});
更新:额外变量:
var i = 1;
WinJS.xhr({
copiedVar: i,
url: root.results[ copiedVar ].profile_image_url_https,
responseType: 'blob'
}).done(function (result) {
var imgTag = theDiv.children[1].children[0];
var imageBlob = URL.createObjectURL(result.response, {
oneTimeOnly: true
});
imgTag.src = imageBlob; //tempLocalUrl;
});
i = 2;
WinJS.xhr({
copiedVar: i,
url: root.results[ copiedVar ].profile_image_url_https,
responseType: 'blob'
}).done(function (result) {
var imgTag = theDiv.children[2].children[0];
var imageBlob = URL.createObjectURL(result.response, {
oneTimeOnly: true
});
imgTag.src = imageBlob; //tempLocalUrl;
});
典型的方法是使用额外的函数(立即执行)捕获循环变量的当前值,例如:
var i = 1;
WinJS.xhr({
url: root.results[i].profile_image_url_https,
responseType: 'blob'
}).done(function (inner_i) {
// return the actual callback
return function (result) {
// use `inner_i` as needed
var imgTag = theDiv.children[1].children[0];
var imageBlob = URL.createObjectURL(result.response, {
oneTimeOnly: true
});
imgTag.src = imageBlob; //tempLocalUrl;
};
}(i)); // <= pass outer `i`
var i=1;
WinJS.xhr({
url:root.results[i].profile\u image\u url\u https,
响应类型:“blob”
}).done(功能(内部_i){
//返回实际的回调
返回函数(结果){
//根据需要使用'internal_i'
var imgTag=theDiv.children[1]。children[0];
var imageBlob=URL.createObjectURL(result.response{
只有一次:是的
});
imgTag.src=imageBlob;//模板库;
};
}(i) );// 在这种情况下,增加回调中的值可能会导致错误。但是解决这个范围问题的一般方法是使用javascript闭包。请看一下 < p>这是一个很好的例子,我会考虑使用嵌套的承诺的方法,嵌套:
var operations = [];
for(var i = 0; i < 10; i++) {
operations.push(WinJS.join({
myValue: i,
xhr: WinJS.xhr({ url: "http://foo" }),
}).then(function(data) {
var yourValue = data.myValue;
var xhrResponse = data.xhr;
// Your processing you had before
}));
}
WinJS.Promise.join(operations).done(function(operations) {
// Done
});
var操作=[];
对于(变量i=0;i<10;i++){
push(WinJS.join({
我的价值观:我,
xhr:WinJS.xhr({url:http://foo" }),
}).then(功能(数据){
var yourValue=data.myValue;
var xhrResponse=data.xhr;
//你以前的处理过程
}));
}
WinJS.Promise.join(操作).done(函数(操作){
//完成
});
这为您提供了将内容隔离和包含的机会。这是Javascript中常见的范围界定问题。通常通过引入一个新的作用域层来解决这个问题,那么您的实际代码是否实现了一个循环,而不是重复调用xhr()
?另外,您的最终目标是链接请求还是并行执行所有请求?我是否取决于请求发送的顺序还是完成的顺序?i
不用于回调,只用于将立即发生的.url
赋值。所以我看不出你在哪里遭受异步行为的折磨。@Yoshi,提问者实际上也想在回调中使用I
。@FrédéricHamidi啊,我没有理解;)但根据“完成”的顺序,这可能会把事情搞砸。事实上,问题是这是关于订单“完成”还是订单“发送”(我假设发送)我只是注意到了对不起!我看不出你在哪里再次使用了I,所以也许你可以进一步解释一下它与“结果中获取的url”选项卡不匹配的原因?等一下。。。我真的不明白为什么你需要一个变量。你就不能硬编码这些值吗?你能解释一下这有什么帮助吗?我不认为这是一个范围问题,这是一个异步调用的问题。当您创建参数对象时,额外的函数将以I
作为参数调用,并且函数将立即返回值,即使在对象创建后I的值发生变化。对了,是的,这是有意义的!