Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript回调函数的泛化_Javascript_Windows 8_Callback - Fatal编程技术网

javascript回调函数的泛化

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

我想创建大约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 = 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的值发生变化。对了,是的,这是有意义的!