isNaN()
и Number.isNaN()
оба теста, если значение (или, в случае isNaN()
, могут быть преобразованы в числовое значение, которое представляет) значение NaN
. Другими словами, «NaN» не просто означает, что «это значение не является числом», это конкретно означает «это значение является числовым значением Not-a-Number в соответствии с IEEE-754».
Причина, по которой все ваши тесты выше, возвращает false, потому что все указанные значения могут быть преобразованы в числовое значение, которое не является NaN
:
Number('') // 0
Number(' ') // 0
Number(true) // 1
Number(false) // 0
Number([0]) // 0
Причина isNaN()
«сломан», потому что, якобы, преобразования типов не должны происходить при тестировании значений. Это проблема Number.isNaN()
, предназначенная для решения. В частности, Number.isNaN()
будет только попытаться сравнить значение с NaN
, если значение представляет собой числовое значение. Любой другой тип будет возвращать false, даже если они буквально «не являются числом», потому что тип значения NaN
является числом. См. Соответствующие MDN-документы для isNaN()
и Number.isNaN()
.
Если вы просто хотите определить, имеет ли значение номер type, , даже если это значение NaN
, вместо этого используйте typeof
:
typeof 'RAWRRR' === 'number' // false
Отвечая на свой вопрос, так как я нигде не мог найти ответ. Вместо того чтобы создавать один обработчик multi-cURL, я создал один для каждого из адресов, которые необходимо запросить. Смотрите код ниже:
$urlList = [
'https://httpstat.us/200?sleep=3000',
'https://httpstat.us/200?sleep=1000'
];
processList($urlList, function($key, $output) {
echo "Output from {$key}\n{$output}\n\n";
});
function processList($urlList, $closure) {
$curlHandlerList = $multiCurlHandlerList = [];
foreach ($urlList as $i => $url) {
$ch = $curlHandlerList[$i] = curl_init();
$mh = $multiCurlHandlerList[$i] = curl_multi_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
]);
curl_multi_add_handle($mh, $ch);
}
while (count($multiCurlHandlerList)) {
foreach ($multiCurlHandlerList as $i => $mh) {
if (CURLM_OK != curl_multi_exec($mh, $active) || !$active) {
$html = curl_multi_getcontent($curlHandlerList[$i]);
$closure($i, $html);
curl_multi_remove_handle($mh, $curlHandlerList[$i]);
unset($multiCurlHandlerList[$i], $curlHandlerList[$i]);
}
}
usleep(10**4); // 10**4 microseconds => 0.01 seconds
}
}