我正在构建一个页面,该页面使用Slideshare API从特定的Slideshare用户中提取一组有限的演示文稿,并输出一系列嵌入了这些演示文稿的iframe。
在大多数情况下,页面按预期工作,但最近删除了API调用的一个演示文稿,因此当页面加载iframe时,浏览器返回410.遗憾的是,XML中没有对象由Slideshare返回,可用于确定该特定演示文稿是否已被删除。
因此,我想在将特定iframe添加到页面之前检查410错误。让我感到困难的是,在进行API调用时不会出现错误,而是在嵌入的iframe加载时出现,因此我不知道在何处或如何进行相应的检查。
以下是相关代码:
$.ajax({
url: slideShareURL,
dataType: 'XML',
success: function(data) {
var allSlides = x2js.xml2json(data);
allSlides = allSlides.User.Slideshow;
for (i = 0; i < allSlides.length; i++) {
document.getElementById('slides').innerHTML += allSlides[i].Embed;
}
}
});
注意:
编辑:Christophe在下面提供的答案几乎是完美的,但我必须添加一个闭包,以使第二个ajax调用在for循环中工作。
答案 0 :(得分:1)
public function loginAction(Request $request)
{
$frame = $this->createFrame();
try {
try {
$user = $this->get('secure.user_provider')->loadUserByUsername($request->get('_username'));
} catch (UsernameNotFoundException $exception) {
$frame->setError($exception);
return $frame;
}
$token = new UsernamePasswordToken($user, null, 'webapi', $user->getRoles());
$this->get('security.token_storage')->setToken($token);
$event = new InteractiveLoginEvent($request, $token);
$this->get('event_dispatcher')->dispatch('security.interactive_login', $event);
$authenticationUtils = $this->get('security.authentication_utils');
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
if ($error) {
$frame->setError(true, Errno::GENERAL_BAD_CREDENTIALS, [$error->getMessage()]);
}
} catch (\Exception $e) {
$frame->setException($e);
}
return $frame;
}
答案 1 :(得分:0)
Christophe提供的答案让我走上正轨,但是在for循环中正确运行第二个ajax调用是不可能的。经过一些研究后,我了解了闭包,并提出了以下建议:
$.ajax({
url: slideShareURL,
dataType: 'XML',
success: function(data) {
var allSlides = x2js.xml2json(data);
allSlides = allSlides.User.Slideshow;
for (i = 0; i < allSlides.length; i++) {
(function(i) {
var slideURL = allSlides[i].SlideshowEmbedUrl;
$.ajax({
url: slideURL,
success: function () {
document.getElementById('slides').innerHTML += allSlides[i].Embed;
},
error: function () {
console.log('Failed to load');
}
})
})(i);
}
}
});