我有一个页面,当用户滚动到底部时,我需要动态加载ajax内容.问题是JQuery没有返回正确的窗口高度.我之前使用过这个函数,从未见过它失败,但由于某种原因,它将返回与文档高度相同的值.我在这里有测试页面:bangstyle.com/test-images
我已将警报编码为在页面加载时显示,并且每当用户在顶部下方滚动500px时:
function scroller() {
if($(window).scrollTop() > 500){
delay(function(){ //200ms wait
pagecounter++;
sideshow();
alert("window height: " + $(window).height() + " scrolltop: " + $(window).scrollTop() + " document height: " + $(document).height());
return false;
}, 200 );
}
}
Run Code Online (Sandbox Code Playgroud)
我之前试过发布这个,但我删除它,因为我没有得到解决方案.我希望可以发布我的测试页面的链接.顺便说一句,我已经在Mac Safari和Mac FF上测试了这个.我在其他页面上运行相同的代码,它工作正常.我觉得这个页面的dom必定会有一些东西导致JS失败,但不知道会是什么.
我正在编写一个PHP脚本来做一些后端的东西,需要每8小时左右运行一次.该脚本需要一段时间才能执行.对于它的地狱,我在我的浏览器中尝试了它,并且在脚本终止之前很快就重置了与服务器的连接.我的问题是 - 如果我直接运行,即.php -a file.php作为cron作业,执行时是否存在内部时间限制?此脚本可能需要2-5分钟才能完成,并且无法中断.我之前从未这样做过,所以我不确定php在运行繁重的脚本时是否有怪癖.
我有一些代码可以进行db调用和网络请求,我把它包装在try/catch中.问题是我永远无法捕获异常,它们似乎不是致命的例外:
try {
// make db requests and network calls
} catch (Exception $e) {
// handle exception
}
Run Code Online (Sandbox Code Playgroud)
也就是说,我遇到了以下例外情况:
[Illuminate\Database\QueryException]
[PDOException]
[InvalidArgumentException]
Run Code Online (Sandbox Code Playgroud)
有没有办法捕捉这些例外?我是否需要明确每种可能的异常对象类型(意味着我必须创建许多try/catches),或者是否有推荐的方法来捕获非致命异常?
我正在测试Laravel 5.1中的队列功能.我可以在我的数据库表中将作业排队,称为作业,我可以让它们成功运行.我还创建了一个名为failed_jobs的队列故障表.为了测试它,在jobs表中我操纵有效负载数据使其失败然后我像这样运行队列工作守护进程,所以它会在一次失败尝试后将作业放入failed_jobs表中:
php artisan queue:work --daemon --tries=1 --queue=myqueue
Run Code Online (Sandbox Code Playgroud)
当作业失败时,它会立即按预期放入failed_jobs表中.
仅供参考我就像Laravel 5.1文档推荐的那样:
http://laravel.com/docs/5.1/queues#dealing-with-failed-jobs
我已经尝试在AppServiceProvider的boot()方法中注册我的队列失败事件,如文档中所述:
Queue::failing(function ($connection, $job, $data) {
Log::error('Job failed!');
});
Run Code Online (Sandbox Code Playgroud)
我也在实际的作业脚本中尝试了fail()方法,如下所示:
/**
* Handle a job failure.
*
* @return void
*/
public function failed()
{
Log::error('failed!');
}
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,当排队的作业失败时都不会触发这些事件.我在日志中看不到任何内容,除了我故意发生的异常堆栈跟踪.Laravel 5.1在这里有错误还是我遗漏了什么?
更新:
我做了一些更多的研究.当发生队列作业失败时,处理该失败的逻辑在vendor/laravel/framework/src/Illuminate/Queue/Worker.php中:
protected function logFailedJob($connection, Job $job)
{
if ($this->failer) {
$this->failer->log($connection, $job->getQueue(), $job->getRawBody());
$job->delete();
$job->failed();
$this->raiseFailedJobEvent($connection, $job);
}
return ['job' => $job, 'failed' => true];
}
Run Code Online (Sandbox Code Playgroud)
失败的()函数永远不会执行,它会阻止调用下一个函数raiseFailedJobEvent().就好像脚本在调用failed()时静默停止.现在,如果我颠倒这些行的顺序,我可以触发raiseFailedJobEvent(),如果我在EventServiceProvider.php或AppServiceProvider.php中注册一个队列事件处理程序,我可以验证它被触发,我可以成功处理该事件.不幸的是,在raiseFailedJobEvent()之前失败()会阻止此事件发生.
更新:
问题似乎源于我如何使其失败.如果我故意破坏作业队列表中的数据,则永远不会调用failed()方法.日志中有一个堆栈跟踪:
Stack trace:
#0 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'unserialize():
Run Code Online (Sandbox Code Playgroud)
如果我实际进入vendor/laravel/framework/src/Illuminate/Queue/Worker.php并在每次运行时强制它失败(当然是以无异常的方式),则调用failure().显然,问题是如何知道这个队列在真实世界中的失败?如果损坏的数据库数据导致失败但仍然阻止调用fail(),则这是不好的.如果现实世界中存在db队列数据的实际损坏怎么办?
我正在制作一个通过控制器调用的命令。当我做一个像这样的简单示例命令和控制器时,它可以工作:
//Controller
$command = new TestCommand();
$this->dispatch($command);
//Command
public $name;
public function __construct()
{
$this->name = 'hi';
}
public function handle(TestCommand $command)
{
dd($command->name);
}
Run Code Online (Sandbox Code Playgroud)
当我通过控制器调用命令时,我得到“hi”,这是正确的。但是当我尝试通过构造函数传递一些东西时,我得到了绑定解析异常:
//Controller
$command = new TestCommand('hi');
$this->dispatch($command);
//Command
public $name;
public function __construct($name)
{
$this->name = $name;
}
public function handle(TestCommand $command)
{
dd($command->name);
}
Run Code Online (Sandbox Code Playgroud)
为什么是这样?我所做的看起来与我在 Laravel 文档示例中发现的相同,但我得到了这个例外:
Container.php 第 872 行中的 BindingResolutionException:无法解析的依赖项解析类 App\Commands\TestCommand 中的 [Parameter #0 [ $name ]]
我试图使用sqlite db进行测试,因为我不想触摸我的实际数据库:
在我的unit.suite.yml文件中:
class_name: UnitTester
modules:
enabled: [Asserts, UnitHelper]
config:
Db:
dsn: 'sqlite:app/tests/_data/testdb.sqlite'
user: ''
password: ''
dump: app/tests/_data/dump.sql
Run Code Online (Sandbox Code Playgroud)
在我的TestCase.php文件中,我有一个函数可以重置和迁移并为db进行种子测试:
Artisan::call('migrate:reset');
Artisan::call('migrate');
Artisan::call('db:seed');
Run Code Online (Sandbox Code Playgroud)
我还将sqlite设置添加到app/config/testing/database.php:
<?php
// Codeception testing environment uses SQLITE
return [
'default' => 'sqlite',
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => 'app/tests/_data/testdb.sqlite',
'prefix' => ''
],
]
];
Run Code Online (Sandbox Code Playgroud)
我可以验证是否正在读取database.php文件,但是某些东西仍然阻止了sqlite的使用,我仍然最终收回了我的REAL数据库(MySQL).如何强制Laravel/Codeception使用我的测试数据库?
我正在使用"Istanbul cover test.js"运行一些节点js单元测试,其中test.js是主测试文件,它将调用我们的代码库中的实际脚本.问题是它生成的覆盖率报告只在test.js文件上,而不在代码库中的实际代码行上.请原谅我这是一个愚蠢的问题,但是如何让它显示测试所涉及的实际文件的覆盖范围?
我有一个类,它使用 Laravel 的全局 event() 函数在模型更改时触发单个事件。我能够防止在单元测试期间触发此事件的唯一方法是实际命名空间并在测试本身中声明一个新的 event() 函数并使其不执行任何操作。它有效,但对我来说似乎不是一个很好的解决方案。我查看了 Laravel 文档,发现有些人在测试中成功使用了 Event::fake() ,但是当我尝试这样做时,我得到:
BadMethodCallException: Method Mockery_0_Illuminate_Contracts_Events_Dispatcher::until() does not exist on this mock object
Run Code Online (Sandbox Code Playgroud)
我使用的是 Laravel 5.4。有没有更干净的方法来防止在测试期间触发此事件?我真的不喜欢声明一个空的命名空间 event() 函数的想法。
编辑:
我正在测试的类是 UserDomain 类。在逻辑的一部分中,它调用 Laravel 的全局 event() 方法:
event(new RoleChanged($this->user));
Run Code Online (Sandbox Code Playgroud)
为了在测试中抑制这种情况的发生,我尝试了 Event::fake() 并且还尝试使用 Trait WithoutEvents 及其 withoutEvents() 方法。两者都不起作用,并且两次都会出现我上面提到的相同错误。
我有一个页面,当用户向下滚动到页面的某个部分时,我会触发ajax加载事件.我在这里有以下ajax事件处理程序:
$(document).ajaxStart(function() {
$('#loader').show();
$(window).off('scroll');
});
$(document).ajaxComplete(function() {
$('#loader').hide();
$(window).on('scroll');
});
Run Code Online (Sandbox Code Playgroud)
为了防止ajax事件多次触发,我在ajax调用开始时关闭了scroll事件处理程序(我还编写了一个延迟函数,它将在触发之前等待几毫秒).我的意图是在ajax完成后重新绑定滚动.我知道这些事件正在发生,因为我的#loader div按设计加载和卸载.不幸的是,滚动永远不会重新绑定,它仍然关闭,我无法理解为什么.因此,我加载一个新内容的ajax页面,然后它停止工作.
我正在阅读"Zend Framework - A Beginner's Guide"一书中的例子.我差不多完成了,但我发现了一些奇怪的问题.其中一个是在我的admin.phtml布局文件中.我有这个代码:
<?php echo $this->headLink()->appendStylesheet($this->baseUrl().'/css/master.css'); ?>
Run Code Online (Sandbox Code Playgroud)
当我加载页面时,我看到它显示master.css链接两次:
<link href="/square2/public/css/master.css" media="screen" rel="stylesheet" type="text/css" />
<link href="/square2/public/css/master.css" media="screen" rel="stylesheet" type="text/css" />
Run Code Online (Sandbox Code Playgroud)
当我按预期注释掉appendStyleSheet()函数时,什么都没有显示出来.当我只拨打一次电话时,这个功能有两次这样做的原因是什么?
附录:作为测试,我做了两个appendStyleSheet函数,在结果页面中我看到CSS文件三次,显然是第一次调用两次,第二次调用一次.有线索吗?