Нет обходного пути для понимания асинхронного кода.Вы пресекаете свой путь здесь.
Если вы не собираетесь использовать async / await , то вам нужно бороться с тем, что JavaScript является однопоточным, иникогда не может блокировать ожидание завершения асинхронной операции, поэтому вы никогда не можете просто напрямую использовать возвращаемое значение из асинхронного метода, как вы пытаетесь сделать здесь:
createAnswer
- асинхронныйметод, возвращающий обещание , а не ответ, так что это неправильно :
pc.setLocalDescription( // <-- wrong
pc.createAnswer(setLocalAndSendMessage, function(err) { //
console
.log(err.name + ': ' + err.message)
.then(pc.setLocalDescription);
})
);
Вы звоните setLocalDescription(promise)
, что дает вам ошибку, которую выупомянуть, поскольку обещание не является действительным описаниемВместо этого обещание - это объект, к которому вы добавляете обратные вызовы :
const promise = pc.createAnswer();
promise.then(setLocalAndSendMessage, function(err) {
console.log(err.name + ': ' + err.message);
});
или просто:
pc.createAnswer()
.then(setLocalAndSendMessage, function(err) {
console.log(err.name + ': ' + err.message);
});
Мы можем даже последовательно использовать then
для формирования цепочка обещаний :
pc.createAnswer()
.then(function(answer) {
return pc.setLocalDescription(answer);
})
.then(function() {
sendMessage(pc.localDescription);
})
.catch(function(err) {
console.log(err.name + ': ' + err.message);
});
Кроме того, я не должен был вам говорить console.log()
не возвращает обещание!
К сожалению, вы копируете действительно старый код здесь, а RTCPeerConnection
имеет некоторые устаревшие API и выполняет некоторые трюки, чтобы иногда позволить вызывающим абонентам сойти с рук при вызове этих методов согласования без по-настоящему цепочки обещаний или проверки на наличие ошибок.Но это неизбежно приводит к неприятностям.