Este não é um problema do mundo real, estou apenas tentando entender como as promessas são criadas.
Preciso entender como fazer uma promessa para uma função que não retorna nada, como setTimeout.
Suponha que eu tenha:
function async(callback){
setTimeout(function(){
callback();
}, 5000);
}
async(function(){
console.log('async called back');
});
Como faço para criar uma promessa que async
pode retornar após o setTimeout
está pronto para callback()
?
Acho que embrulhar me levaria a algum lugar:
function setTimeoutReturnPromise(){
function promise(){}
promise.prototype.then = function() {
console.log('timed out');
};
setTimeout(function(){
return ???
},2000);
return promise;
}
Mas não consigo pensar além disso.
javascript
settimeout
promise
laggingreflex
fonte
fonte
async function async(){...}
Respostas:
Atualização (2017)
Aqui em 2017, as Promises são integradas ao JavaScript, foram adicionadas pela especificação ES2015 (polyfills estão disponíveis para ambientes desatualizados como IE8-IE11). A sintaxe usada usa um retorno de chamada que você passa para o
Promise
construtor (oPromise
executor ) que recebe as funções para resolver / rejeitar a promessa como argumentos.Primeiro, como
async
agora tem um significado em JavaScript (mesmo que seja apenas uma palavra-chave em certos contextos), vou usarlater
como o nome da função para evitar confusão.Atraso Básico
Usando promessas nativas (ou um polyfill fiel) ficaria assim:
Observe que isso pressupõe uma versão
setTimeout
compatível com a definição de navegadores ondesetTimeout
não passa nenhum argumento para o retorno de chamada, a menos que você os forneça após o intervalo (isso pode não ser verdade em ambientes sem navegador, e não costumava ser verdade no Firefox, mas agora; é verdade no Chrome e até mesmo no IE8).Atraso básico com valor
Se quiser que sua função passe opcionalmente um valor de resolução, em qualquer navegador vagamente moderno que permite fornecer argumentos extras para
setTimeout
após o atraso e, em seguida, passa-os para o retorno de chamada quando chamado, você pode fazer isso (Firefox e Chrome atuais; IE11 + , presumivelmente Edge; não IE8 ou IE9, nenhuma ideia sobre o IE10):Se você estiver usando as funções de seta ES2015 +, isso pode ser mais conciso:
ou mesmo
Atraso cancelável com valor
Se você deseja possibilitar o cancelamento do timeout, não pode simplesmente devolver uma promessa de
later
, porque as promessas não podem ser canceladas.Mas podemos facilmente retornar um objeto com um
cancel
método e um acessador para a promessa e rejeitar a promessa no cancelamento:Exemplo ao vivo:
Resposta Original de 2014
Normalmente, você terá uma biblioteca de promessas (uma que você mesmo escreve ou uma das várias por aí). Essa biblioteca geralmente terá um objeto que você pode criar e "resolver" posteriormente, e esse objeto terá uma "promessa" que você poderá obter dele.
Então
later
, tenderia a ser algo assim:Em um comentário sobre a pergunta, perguntei:
E você disse
Para ajudar nesse entendimento, aqui está um exemplo muito básico , que não é remotamente compatível com Promises-A: Live Copy
fonte
Esta não é uma resposta à pergunta original. Mas, como uma pergunta original não é um problema do mundo real, não deve ser um problema. Tentei explicar a um amigo o que são promessas em JavaScript e a diferença entre promessa e retorno de chamada.
O código abaixo serve como explicação:
JsFiddle
fonte