Я работаю с JavaScript обещает в последнее время и наткнулся на следующую ситуацию, которая заставила меня задуматься:Выполняют ли обещания асинхронно или синхронно?
var combinedArray = [];
function getArrayOne() {
$http.post(arrayOnePath).then(function(arr) {
combinedArray = combinedArray.concat(arr);
}) // More code preventing me from using Promise.all(...)
}
function getArrayTwo() {
$http.post(arrayTwoPath).then(function(arr) {
combinedArray = combinedArray.concat(arr);
}) // More code preventing me from using Promise.all(...)
}
function getAllArrays() {
getArrayOne();
getArrayTwo();
}
Пока я писал эту логику до меня дошло, что может быть потенциальным условия гонки, если оба обещания решить в то же время (когда они обращаются к общему ресурсу). Подумав об этом еще некоторое время, я понял, что после сообщения post выполняются разрешения then(..)
, что означает, что этот код работает в среде синхронного выполнения JavaScript.
Может ли кто-то предоставить мне некоторую ясность в отношении того, могут ли два заявления combinedArray.concat(arr);
вызвать проблему, если обе обетования будут разрешены одновременно?
[Редактировать] Следуя некоторым комментариям, я просто хочу добавить, что я не против, какой порядок объединяет массивы в combinedArray
.
До тех пор, пока ваша логика не зависит от того, какой заказ отправляет решение, вы в порядке. Вы столкнулись бы только с проблемой, если, например, mixedArray [0] всегда должен быть первой записью из getArrayOne. – Shilly
Состояние гонки, если вы ожидаете, что ваш 'объединенныйArray' будет иметь заданный порядок. Но нет, два обратных вызова javascript никогда не вызываются одновременно. – Bergi
Несмотря на то, что ответ «один поток» Javascript - это тот, который вы искали, другое чтение названия вопроса напоминает [этот вопрос SO] (http://stackoverflow.com/q/38059284/1426891) («Почему JavaScript Promise, а затем обработчик запускается после другого кода? »), Спрашивая, как обработчики' then' гарантированно будут вызываться асинхронно. –