Javascript 为什么我的jquery.get()结果不能按我给出的顺序显示
我正试图通过javascript制作一个google shortener分析工具,这是我的代码:Javascript 为什么我的jquery.get()结果不能按我给出的顺序显示,javascript,jquery,ajax,api,google-url-shortener,Javascript,Jquery,Ajax,Api,Google Url Shortener,我正试图通过javascript制作一个google shortener分析工具,这是我的代码: <script> function makeRequest() { for (var i=0; i < shortUrl.length; i++){ var url = shortUrl[i]; var request = gapi.client.urlshortener.url.get({ 'shortUrl': url,
<script>
function makeRequest() {
for (var i=0; i < shortUrl.length; i++){
var url = shortUrl[i];
var request = gapi.client.urlshortener.url.get({
'shortUrl': url,
'projection':'FULL',
});
request.execute(function(response) {
console.log(response); //here is the problem begin
var result = {
short: response.id,
clicks: response.analytics.allTime.shortUrlClicks
};
appendResults(result, i);
});
}
}
function load() {
gapi.client.setApiKey('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
gapi.client.load('urlshortener', 'v1', makeRequest);
}
</script>
<script src="https://apis.google.com/js/client.js?onload=load"></script>
函数makeRequest(){
对于(var i=0;i
每次的结果都会让我不一样!
前任:
短URL[1,2,3,4]
它将返回3,2,1,4或1,2,4,3……等
我的代码怎么了?
是异步问题吗?我怎样才能修好它?
请帮帮我!
因为ajax是异步的。你必须使用承诺。 jQuery示例
var promises = [];
for (var i=0; i < shortUrl.length; i++){
var dfd = new $.Deferred;
var url = shortUrl[i];
var request = gapi.client.urlshortener.url.get({
'shortUrl': url,
'projection':'FULL',
});
request.execute((function(dfd){return function(response) {
dfd.resolve(response);
};})(dfd));
promises.push(dfd.promise());
}
$.when.apply($, promises).done(function(){
promises = undefined;
for(var i in arguments){
var response = arguments[i];
console.log(response); //here is the problem begin
var result = {
short: response.id,
clicks: response.analytics.allTime.shortUrlClicks
};
appendResults(result, i);
}
});
var承诺=[];
对于(var i=0;i
我的工作代码:
var promises = [];
var request = function(i, callback){
setTimeout(function(){return callback(i);},100 - i);
}
for (var i=0; i < 10; i++){
var dfd = new $.Deferred;
request(i, (function(dfd){return function(response) {
dfd.resolve(response);
};})(dfd));
promises.push(dfd.promise());
}
$.when.apply($, promises).done(function(){
promises = undefined;
for(var i in arguments){
console.log(arguments[i]);
}
});
var承诺=[];
var请求=函数(i,回调){
setTimeout(函数(){return callback(i);},100-i);
}
对于(变量i=0;i<10;i++){
var dfd=新的递延美元;
请求(i)(函数(dfd){返回函数(响应){
解决(响应);
})(dfd);;
promises.push(dfd.promise());
}
$.when.apply($,promissions).done(函数(){
承诺=未定义;
for(参数中的变量i){
log(参数[i]);
}
});
使用类型为get和async的$.ajax()代替get():false@user8888只是不,从来没有。忘记async:false
选项甚至存在。@AnthonyGrist如果可以的话,我会+1000该注释@我会忘记给我一个理由哦async:false
我多么恨你,让我数一数。。。。1.它会导致浏览器事件循环暂停,2。导致“页面未响应错误”,3。是阿贾克斯,不是SJAX!想法正确,执行不力。。。(例如,参数中变量i的?!)我的控制台:未捕获类型错误:未定义不是一个函数它对我不起作用,是不是出了什么问题@阿尔尼塔克你什么意思?Is(对于参数中的var i)是一种不好的方式吗?对于。。。in
用于枚举对象,而不是数组。此外,解析调用可以直接写入request.execute(dfd.resolve)
-response
参数仍然会被传递,它将被附加到右侧的Deferred
。我没有测试该代码。when.apply必须使用所有响应调用done回调。