Eu tenho um aplicativo que exige que os dados sejam carregados em uma determinada ordem: a URL raiz, os esquemas e, finalmente, inicialize o aplicativo com os esquemas e URLs dos vários objetos de dados. À medida que o usuário navega no aplicativo, os objetos de dados são carregados, validados no esquema e exibidos. À medida que o usuário cria os dados, os esquemas fornecem validação de primeira passagem.
Estou tendo um problema com a inicialização. Eu uso uma chamada Ajax para buscar o objeto raiz, $ .when () e, em seguida, crio uma matriz de promessas, uma para cada objeto de esquema. Isso funciona. Eu vejo a busca no console.
Então, vejo a busca de todos os esquemas, para que cada chamada $ .ajax () funcione. fetchschemas () realmente retorna uma série de promessas.
No entanto, a cláusula final when () nunca é acionada e a palavra "DONE" nunca aparece no console. O código-fonte para o jquery-1.5 parece implicar que "nulo" é aceitável como um objeto para passar para $ .when.apply (), pois quando () criará um objeto Deferred () interno para gerenciar a lista se nenhum objeto for Transmitido.
Isso funcionou usando o Futures.js. Como deve ser gerenciada uma matriz de adiados jQuery, se não for assim?
var fetch_schemas, fetch_root;
fetch_schemas = function(schema_urls) {
var fetch_one = function(url) {
return $.ajax({
url: url,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
};
return $.map(schema_urls, fetch_one);
};
fetch_root = function() {
return $.ajax({
url: BASE_URL,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
};
$.when(fetch_root()).then(function(data) {
var promises = fetch_schemas(data.schema_urls);
$.when.apply(null, promises).then(function(schemas) {
console.log("DONE", this, schemas);
});
});
fonte
Respostas:
Você está procurando
Isso também funcionará (para algum valor do trabalho, ele não corrigirá ajax quebrado):
Você vai querer passar em
$
vez denull
para quethis
dentro$.when
se refirajQuery
. Não deve importar para a fonte, mas é melhor do que passarnull
.Zombou de todos os seus $ .ajax substituindo-os por
$.when
e a amostra funcionaPortanto, é um problema na sua solicitação ajax ou na matriz sua passagem para fetch_schemas.
fonte
.then(a,b) === .done(a).fail(b)
é uma taquigrafia preguiçosa. Você pode ligar.done(a).fail(b)
se quiser #$.when.apply($, ...
. Onull
que me faz ir "espera, o que?". É uma questão de estilo e prática de codificação. Eu tive que ler a fonte para confirmarthis
que não lançaria uma referência nula dentro do jQuery.when!A solução alternativa acima (obrigado!) Não resolve adequadamente o problema de retornar os objetos fornecidos ao
resolve()
método adiado porque o jQuery chama os retornos de chamadadone()
efail()
com parâmetros individuais, não uma matriz. Isso significa que precisamos usar oarguments
pseudo-array para obter todos os objetos resolvidos / rejeitados retornados pelo array de adiados, o que é feio:Como passamos uma série de diferidos, seria bom recuperar uma série de resultados. Também seria bom recuperar uma matriz real em vez de uma pseudo-matriz, para que possamos usar métodos como
Array.sort()
.Aqui está uma solução inspirada por when.js 's
when.all()
método que aborda estes problemas:Agora você pode simplesmente passar uma matriz de adiamentos / promessas e recuperar uma matriz de objetos resolvidos / rejeitados em seu retorno de chamada, assim:
fonte
apply()
... ir entender.arguments
manipulação oculta em seu próprio método. Ótimo para reutilização, mas não aborda a "feiúra" de ter que lidararguments
(você poderia facilmente ter:var schemas=Array.prototype.slice.call(arguments);)
deferred.fail(...)
lerdeferred.reject(...)
?Se você estiver usando a versão ES6 do javascript Há um operador de propagação (...) que converte a matriz de objetos em argumentos separados por vírgula.
Saiba mais sobre o operador de propagação ES6 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator, encontre aqui
fonte
estende quando com este código:
fonte