Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.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 导致问题的异步url验证_Javascript_Php_Jquery_Ajax_Rss - Fatal编程技术网

Javascript 导致问题的异步url验证

Javascript 导致问题的异步url验证,javascript,php,jquery,ajax,rss,Javascript,Php,Jquery,Ajax,Rss,我正在使用Google的FeedAPI构建一种RSS提要阅读器。经过多次尝试和错误,我已经能够通过PHP实例化到给定RSS URL的连接,并返回JSON对象。我遇到的问题是,我试图验证一个数组中的多个URL,但由于AJAX的异步性质,以及通过Google API加载时间延迟,结果代码在验证完成之前就发出了。我曾经尝试过这样的事情:强制同步、设置超时、对调用验证的对象进行承诺,等等,但我却一无所获。任何帮助都将不胜感激 我的代码: PHP 此代码段成功创建到给定提要URL的连接,并返回包含提要数据

我正在使用Google的FeedAPI构建一种RSS提要阅读器。经过多次尝试和错误,我已经能够通过PHP实例化到给定RSS URL的连接,并返回JSON对象。我遇到的问题是,我试图验证一个数组中的多个URL,但由于AJAX的异步性质,以及通过Google API加载时间延迟,结果代码在验证完成之前就发出了。我曾经尝试过这样的事情:强制同步、设置超时、对调用验证的对象进行承诺,等等,但我却一无所获。任何帮助都将不胜感激

我的代码: PHP

此代码段成功创建到给定提要URL的连接,并返回包含提要数据的JSON对象。我通过以下AJAX调用调用此外部php脚本:

阿贾克斯:

var conn = $.ajax({
     url : "php/feedlog.php",
     type : "post",
     data : {feed: feed_a[i]}
});

conn.done(function (data){
    var err = eval('(' + data + ')' ).responseStatus;
    if (err==200){
        console.log("Success");
    } else if (err==400){
        console.log("Failure with: " + err);
    }
}); 
这段代码可以完美地用于一次连接尝试,但是我需要线性地逐步完成一个提要数组,测试一个提要,等待连接结果,然后继续执行数组中的下一个提要,或者中断一个成功的连接

我尝试为feed_a[]使用$.each语句,但循环的启动速度比返回结果的速度快。我想我需要操作一个缓冲区,但我不知道如何实现它

一如既往,如果需要,我可以提供额外的代码,以前的尝试,或更大的澄清要求。如果需要,我可以在我的网站上为演示目的实时托管代码


更直接的问题:如何强制循环$.each、for循环或递归函数等待AJAX调用的结果

另外,为了让我的问题在将来变得更好,有人能解释一下为什么我的问题可能被记下来了吗

编辑:谢谢大家的快速回复!出现以下代码以解决我的问题:

$.each(v_feed, function(_,url){
    $.ajax("php/feedlog.php",{
        type: "POST",
        data: { feed: url }
    }).done(function(data){
        var err = eval('(' + data + ')' ).responseStatus;
        if (err == 200){
            console.log("success with: " + data);
        } else if (err == 400){
            console.log("fail with: " + data);
            console.log("removing from valid array");
            v_feed.splice(v_feed.length - _, 1);
        }
        //console.log(err);
    }).fail(function(){
        console.log("Fail");
    }).complete(function(){
        console.log(v_feed);
    });
});
试试看:

var arrayOfPromises = [];

//inside each/for loop, push request in array
arrayOfPromises.push($.ajax({
     url : "php/feedlog.php",
     type : "post",
     data : {feed: feed_a[i]}
}));
然后在循环外:

$.when.apply($, arrayOfPromises).done(function(data){
     //all requests are done
});
我记不清哪些数据将被传递到done,请检查它。

尝试:

var arrayOfPromises = [];

//inside each/for loop, push request in array
arrayOfPromises.push($.ajax({
     url : "php/feedlog.php",
     type : "post",
     data : {feed: feed_a[i]}
}));
然后在循环外:

$.when.apply($, arrayOfPromises).done(function(data){
     //all requests are done
});

我记不清要将哪些数据传递给done,请检查它。

只有在成功时才触发下一次呼叫:

var worked = {status:true},
 conn = function(successLogic){
 if(feed_a[i]) // I assume this is the loop end condition...
   $.ajax({
     url : "php/feedlog.php",
     type : "post",
     data : {feed: feed_a[i]},
     success: function(data){
       if(successLogic(data));
         worked.status = worked.status && conn(successLogic); // Recursion instead of iteration!
     },
     error: function(err){
       worked.status = false;
       // your error code
     }
   });
   else
     return worked;
};

var completedRecusionPromise = conn(function(data){
  var obj;
  try{
   obj = JSON.parse(data);
  }catch(e){ console.log(e); }
  return !!obj; // Assuming you just want valid JSON??
});

只有在成功时才触发下一个呼叫:

var worked = {status:true},
 conn = function(successLogic){
 if(feed_a[i]) // I assume this is the loop end condition...
   $.ajax({
     url : "php/feedlog.php",
     type : "post",
     data : {feed: feed_a[i]},
     success: function(data){
       if(successLogic(data));
         worked.status = worked.status && conn(successLogic); // Recursion instead of iteration!
     },
     error: function(err){
       worked.status = false;
       // your error code
     }
   });
   else
     return worked;
};

var completedRecusionPromise = conn(function(data){
  var obj;
  try{
   obj = JSON.parse(data);
  }catch(e){ console.log(e); }
  return !!obj; // Assuming you just want valid JSON??
});

循环使用$.each,在发送ajax请求之前为html中的每个提要创建包装,并存储对包装的引用。完成后,使用提要填充包装器。这将允许您一次检索它们,同时仍以正确的顺序将它们添加到页面中,而无需等待它们全部完成

$.each(feedArr, function(_,url){
    var wrapper = $("<div>").appendTo(someel);
    $.ajax("feed.php",{
        type: "POST",
        data: { url: url }
    }).done(function(data){
        // process data...
        wrapper.append(generateFeedHTML(data));
    }).fail(function(){
        wrapper.remove();
    });
});

循环使用$.each,在发送ajax请求之前为html中的每个提要创建包装,并存储对包装的引用。完成后,使用提要填充包装器。这将允许您一次检索它们,同时仍以正确的顺序将它们添加到页面中,而无需等待它们全部完成

$.each(feedArr, function(_,url){
    var wrapper = $("<div>").appendTo(someel);
    $.ajax("feed.php",{
        type: "POST",
        data: { url: url }
    }).done(function(data){
        // process data...
        wrapper.append(generateFeedHTML(data));
    }).fail(function(){
        wrapper.remove();
    });
});

如何强制循环$.each、for循环或递归函数等待AJAX调用的结果?你不能那样做。您使用相对回调/方法来请求和设置逻辑。您可以将延迟/承诺对象数组传递给$.when:$.when.apply$,arrayOfPromises@沃尔夫将能够提供一个基本的例子,或一个网站,这样做?恐怕我不完全理解您所说的相对回调/方法是什么意思。如何强制循环$。each、for循环或递归函数等待AJAX调用的结果?你不能那样做。您使用相对回调/方法来请求和设置逻辑。您可以将延迟/承诺对象数组传递给$.when:$.when.apply$,arrayOfPromises@沃尔夫将能够提供一个基本的例子,或一个网站,这样做?恐怕我不完全理解您所说的相对回调/方法是什么意思。每个ajax请求中的每一组参数都将作为每个参数的数组发送到done参数列表。例如,在代码中,数据将是[ParsedResponsetText,statusCode,jqXHR],表示第一个请求。最好的处理方法是像thingy一样循环参数数组。@KevinB一如既往,谢谢!你的答案更合适,我猜这似乎是我的问题的最佳解决方案,根据我的初步测试。它连接到每个url,返回JSON数据,验证状态代码,然后。当确保我可以忽略错误的连接,并继续对成功的提要进行内容验证时。非常感谢。什么时候我可以省略坏的连接不一定。如果其中任何一个失败,则不会触发“完成”回调。我建议让php总是返回200个成功,然后测试每个请求是否返回了任何内容,看看它是否失败,以确保它们都不会失败。GoogleFeedAPI总是返回一个状态码,因此php脚本只有在URL不正确时才能返回一个值。在wi中,使用上面列出的方法似乎更为一致
我可以从阵列中删除失败的连接,留下一个有效连接的阵列。我已经更新了我的问题。每个ajax请求中的每一组参数都将作为每个请求的数组发送到done参数列表。例如,在代码中,数据将是[ParsedResponsetText,statusCode,jqXHR],表示第一个请求。最好的处理方法是像thingy一样循环参数数组。@KevinB一如既往,谢谢!你的答案更合适,我猜这似乎是我的问题的最佳解决方案,根据我的初步测试。它连接到每个url,返回JSON数据,验证状态代码,然后。当确保我可以忽略错误的连接,并继续对成功的提要进行内容验证时。非常感谢。什么时候我可以省略坏的连接不一定。如果其中任何一个失败,则不会触发“完成”回调。我建议让php总是返回200个成功,然后测试每个请求是否返回了任何内容,看看它是否失败,以确保它们都不会失败。GoogleFeedAPI总是返回一个状态码,因此php脚本只有在URL不正确时才能返回一个值。使用上面列出的方法似乎可以在更广泛的场景中更一致地工作,并且我能够从阵列中删除失败的连接,留下一个有效连接阵列。我已经更新了我的问题。编辑为使用var外部闭包,仅在提要结束时返回,使用对象,所以它的承诺类似于状态编辑为使用var外部闭包,仅在提要结束时返回,使用对象,所以它的承诺类似于状态这实际上回答了一个我还没有遇到的问题,这对于我即将完成的显示内容的任务非常有用。幸运的是,在我的应用程序中,在选择有效的提要之前,结果不需要显示在页面上。非常感谢。我将在以后的任务中引用此评论。这实际上回答了一个我还没有遇到的问题,对于我即将完成的显示内容的任务非常有用。幸运的是,在我的应用程序中,在选择有效的提要之前,结果不需要显示在页面上。非常感谢。我将在以后的任务中引用此评论。