Я использовал обещания какое-то время, но время от времени я спотыкаюсь о проблемах, которые я не могу решить (каламбур не предназначен).Почему мой хэш обещаний решить, прежде чем сработало обещание решить?
У меня есть массив файлов, для которых я должен выполнять асинхронные функции, чтобы каждый файл извлекал некоторые метаданные.
Я использую RSVP.hash()
и передаю массив обещаний, возвращаемых функцией, загружающей некоторые метаданные, и добавляет ее в качестве свойств к файлу. Моя проблема заключается в том, что обещание, возвращенное функцией hash()
, разрешается до того, как любое из пройденных обещаний будет разрешено, и поэтому оно слишком быстро входит в функцию then()
.
Я создал JSfiddle, который иллюстрирует мою проблему. Я изучил возможность того, что это не связано с RSVP, но вместо того, как интерпретатор JavaScript читает код и, возможно, делает немедленную оценку той части, которая, как я думал, будет последней.
Я использую RSVP.hash()
неправильный путь, отсутствует что-то или какие-либо другие ошибки в моем коде, которые заставили бы его вести себя таким образом, а не мои намерения?
Ниже приведен фрагмент кода такой же, как у JSFiddle.
function checkFileStatus(item) {
return new RSVP.Promise(function(resolve, reject) {
setTimeout(function() {
$('#list').append("<li>Checking status for " + item.title);
resolve();
}, 1000);
});
}
function init() {
var fileList = [{
title: "First object"
}, {
title: "Second object"
}, {
title: "Third object"
}];
var statusCheck = fileList.map(function(item) {
return checkFileStatus(item);
});
var promises = {
promisesCheckFileStatus: statusCheck
};
RSVP.hash(promises).then(function() {
$('#list').append("<li>This should happen last!");
});
}
init();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="//cdn.jsdelivr.net/rsvp/3.0.6/rsvp.js"></script>
<div>
<ul id="list"></ul>
</div>
Ничего себе, что простую вещь, чтобы не заметить. В следующий раз, я буду следить за тем, что я действительно передаю как параметры! Спасибо! –