Почему я вижу обещание в ожидании - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть фрагмент кода, используемый для воспроизведения звука. Когда я запускаю его в отладчике FireFox (версия 75.0). Это показывает Обещание в ожидании. Я не вижу Pending в Chrome (79.0.3945.117).

Может кто-нибудь объяснить, пожалуйста, я делаю это правильно. Я надеюсь, что это не приведет к утечке памяти.

 playSound = function (url) {
        return new Promise(function(resolve, reject) {
            var audio = new Audio();
            audio.preload = "auto";
            audio.autoplay = true;
            audio.error = reject;
            audio.onended = resolve;
            audio.src = url;
            audio.play();

        });
    }

playSound('http://techslides.com/demos/samples/sample.mp3').then(function(response) {
console.log("Sound played Successfully.");
}, function(error) {console.log("Sound Failed.", error);}
)

Я попробовал событие в этом примере. Я все еще вижу Обещание в ожидании в Firefox:

testFunction = function () {
return new Promise((resolve, reject) => {
   if (true) {
    resolve("Stuff worked!");
  }
  else {
    reject(Error("It broke"));
  }
});
}

testFunction().then(function(response) {
    console.log("Success::", response);
}, function(error) {
    console.log("Failure::", error);
})

Я делаю что-то в корне неправильно?

1 Ответ

1 голос
/ 16 апреля 2020

Предполагается, что вы говорите о HTMLAudioElement и интерфейсе этого ...

Свойство .error совсем не то, что вам нужно. Это не обработчик событий, это свойство, которое вы прочитали, поэтому присвоение reject ничего не даст.

HTMLAudioElement наследует большинство своих свойств от HTMLMediaElement, которые показывает, что вы должны использовать подобные события error и ended. Запустите фрагмент кода, затем нажмите кнопку воспроизведения, чтобы увидеть, как он работает.

function playSound(url) {
        return new Promise(function(resolve, reject) {
            var audio = new Audio();
            audio.prelopad = "auto";
            audio.autoplay = true;
            audio.addEventListener("error", reject);
            audio.addEventListener("ended", resolve);
            audio.src = url;
            audio.play();

        });
    }

var button = document.getElementById("play");
button.addEventListener("click", function() {
  var url = 'http://techslides.com/demos/samples/sample.mp3';
	playSound(url).then(function(response) {
    log("Promise resolved. Sound played Successfully.");
  }, function(error) {
    log("Promise rejected. Sound Failed.");
  });
});

function log(x) {
   let logger = document.getElementById("log");
   let div = document.createElement("div");
   div.innerHTML = x;
   logger.appendChild(div);
}
<div>
Press the Play button to start the audio<br><br>
<button id="play">
Play
</button>
</div>

<div id="log" style="margin-top: 20px;">

</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...