我有充分的理由相信函数rename()和unlink()都是异步的,根据我的理解,这意味着当调用函数时,它们下面的代码在文件系统上完成其过程之前会继续执行。对于互联网应用程序,这是一个问题,我将在下面解释,因为以后的代码取决于这些更改,这些更改已经确定。那么,有没有办法使两者同步,以便代码读取器在遇到这些功能时冻结,直到其所有任务在文件系统上完全执行为止?
这是delete-image.php中的代码,由ajax从另一个admin-images.php调用(后者将不会显示):
`
foreach ($dirScan as $key => $value) {
$fileParts = explode('.', $dirScan[$key]);
if (isset($fileParts[1])) {
if ((!($fileParts[1] == "gif") && !($fileParts[1] == "jpg")) && (!($fileParts[1] == "png") && !($fileParts[1] == "jpg"))) {
unset($dirScan[$key]);
}
} else {
unset($dirScan[$key]);
}
}
$dirScan = array_values($dirScan);
// for thumbnail
$file = 'galleries/' . $currentGal . '/' . $currentDir . "/" . $dirScan[$imageNum - 1];
unlink($file);
for ($i = ($imageNum - 1) + 1; $i < count($dirScan); $i++) {
$thisFile = 'galleries/' . $currentGal . '/' . $currentDir . '/' . $dirScan[$i];
$thisSplitFileName = explode('.', $dirScan[$i]);
$newName = 'galleries/' . $currentGal . '/' . $currentDir . "/" . ($thisSplitFileName[0] - 1) . "." . $thisSplitFileName[1];
rename($thisFile, $newName);
}
// for large image
$fileParts = explode('.', $dirScan[$imageNum - 1]);
$file = 'galleries/' . $currentGal . '/' . $currentDir . "/large/" . $fileParts[0] . "Large." . $fileParts[1];
unlink($file);
for ($i = ($imageNum - 1) + 1; $i < count($dirScan); $i++) {
$thisSplitFileName = explode('.', $dirScan[$i]);
$thisFile = 'galleries/' . $currentGal . '/' . $currentDir . '/large/' . $thisSplitFileName[0] . "Large." . $thisSplitFileName[1];
$newName = 'galleries/' . $currentGal . '/' . $currentDir . "/large/" . ($thisSplitFileName[0] - 1) . "Large." . $thisSplitFileName[1];
rename($thisFile, $newName);
}
sleep(1);
echo 'deleted ' . $dirScan[$imageNum - 1] . " successfully!";
} else {
echo "please set the post data";
} ?>`
该脚本返回其完成的文本后,admin-
images.php触发一个新函数,该函数从这些重命名和修剪的文件中填充图像表。有时,它会显示应该删除的旧名称和文件,并且通过简单的页面刷新就可以摆脱它们。这似乎表明上述php脚本正在运行所有代码,并在完成文件系统操作之前将回显的文本吐出到mainfile中(所有其他代码又长又复杂,希望手头的讨论没有必要。
)。
您会注意到,我已经尝试过sleep()函数来停止php脚本,以期给它一些时间来完成。这是一种笨拙且有问题的处理方式,因为我必须投入大量时间来确保每次都能正常工作,但是我不希望用户等待的时间比她/他的要长。
我想它们 不是 异步的,因为它们返回一个结果,告诉操作是否成功。
我相信会出现问题是因为scandir
进行修改后运行时,它可能是使用内存中的“缓存”数据,而不是重新扫描文件系统。
问题内容: 我对JavaScript 的本机实现有疑问:它是否异步运行?例如,如果我打电话: 这将是非阻塞的吗? 问题答案: 不,它正在阻止。看一下算法的规格。但是,在MDN上给出了一个可能更容易理解的实现: 如果必须为每个元素执行很多代码,则应考虑使用其他方法: 然后调用: 那时这将是非阻塞的。该示例摘自 High PerformanceJavaScript 。
问题内容: 假设我有这段代码 我想知道的是该函数是否将异步执行。 问题答案: 设完成为Call(执行者,未定义,«resolvingFunctions。[[Resolve]],resolvingFunctions。[[Reject]]»)。 如果完成是突然完成,则 令status为Call(resolvevingFunctions。[[Reject]],undefined,«completion。
问题内容: 在Redis 4.0中,有一个新命令UNLINK删除Redis内存中的密钥。 此命令与DEL非常相似:它将删除指定的密钥。与DEL一样,如果密钥不存在,则将其忽略。但是,该 命令在不同的线程中执行实际的内存回收 , 因此当DEL为时 , 它不会阻塞 。这就是命令名称的来源:该命令只是将键与键空间断开链接。实际的删除将在以后异步发生。 因此,可以始终(100%次)使用UNLINK而不是D
在调试的目的,我写了一个新的代码,看看异步函数是如何工作的,所以我有下一个情况 我有3个函数log1(),log2(),main(),我希望: 当我调用main()时,它应该调用log1(),直到它完成所有语句,然后它应该调用log2() 所以我希望它能输出 1个 2. 但它确实有产出 2. 1个 我要注意的是,我不能编辑slowFunction,您应该将它视为需要未知时间执行的函数,因此我需要等
我目前正在阅读Trevor Burnham的Async Javascript。到目前为止这是一本很棒的书。 他谈到这个片段和console.log在Safari和Chrome控制台中是“异步”的。不幸的是我无法复制这个。代码如下: 如果这是异步的,我会预期结果是books的结果。将console.log()放在事件队列中,直到所有代码执行完毕,然后运行它,它将具有bar属性。 虽然它是同步运行的,
问题内容: 我正在编写一个JavaScript函数,该函数发出HTTP请求并返回对结果的承诺(但该问题同样适用于基于回调的实现)。 如果我立即知道为该函数提供的参数无效,该函数应该同步还是应该返回被拒绝的Promise(或者,如果您愿意,请使用实例调用回调)? 异步功能应 始终 以异步方式运行(特别是对于错误情况)有多重要?是否确定,如果你知道程序是不是一个合适的状态的异步操作继续进行? 例如: