Я открываю файл, чтобы прочитать его содержимое:
convertBlobToBase64(blob){
var convertPromise = new Promise(function(resolve, reject){
var fileReader = new FileReader();
fileReader.onload = function() {
var dataUrl = this.result;
var base64 = dataUrl.split(',')[1];
resolve(base64);
};
fileReader.readAsDataURL(blob);
});
return convertPromise;
}
Затем я вызываю эту функцию и передаю данные результата, когда она разрешается:
myFunction(audioFile){
var to64 = this.convertBlobToBase64(audioFile);
to64.then(function(base64Val){
var nextPromise = postCall();
nextPromise.then(//stuff);
return nextPromise;
});
return to64;
}
Однако, когда я вызываю myFunction, он немедленно возвращает обработанное обещание, которое включает преобразованные данные из convertBlobToBase64, а не неразрешенное обещание, которое должно ожидать на nextPromise, как ожидалось.
Вместо этого myFunction .then вызывается немедленно и терпит неудачу, поскольку у него нет правильных данных. Я неправильно понимаю функцию обещания?
@Endless Для отправки аудиоконтента на сервер.
Разве вы не можете просто отправить его как есть? с FormData? base64 в ~ 3 раза больше по размеру
@Endless, можешь подробнее рассказать об этом? Когда я не кодировал в base64, звук загружался некорректно и отображался как поврежденный. Закачиваю в Dropbox.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуйте этот код:
myFunction(audioFile){
var to64 = this.convertBlobToBase64(audioFile);
return to64.then(function(base64Val){
var nextPromise = postCall();
return nextPromise.then(//stuff);
});
}
это сработало, спасибо. Не могли бы вы объяснить, почему return to64 - это предварительно разрешенное обещание?
Если это сработает, то вот объяснение. Обещание - это то, что оборачивает значение. Поэтому, когда вы вызываете then для обещания, он, в свою очередь, возвращает новое обещание. Таким образом, строка nextPromise.then(//stuff); просто игнорирует возвращенное обещание. Надеюсь, это понятно.
Верно, но почему бы строчке return to64 не быть отложенным обещанием? Почему это уже решено?
Может быть, решение было таким быстрым, ха-ха. Я имею в виду, что to64 не нужно было ждать вещей, которые войдут в и после then.
Кстати, вам не нужно переносить еще одно обещание в функцию. Вы можете использовать свой postCall как функцию разрешения и связать его следующим образом:
myFunction(audioFile){
return convertBlobToBase64(audioFile)
.then(base64Val => postCall())
.then(//stuff)
}
Зачем нужен base64?