2016-12-28 4 views
0

Ci-dessous décrit une promesse qui a deux étapes simples afficher sur la console quelque chose, puis afficher quelque chose d'autre après la première étape est terminée. J'essaie de comprendre comment résoudre la promesse, et permettre à la deuxième étape de se terminer.résoudre une promesse javascript

var lookup_documents = new Promise(
    function(resolve, reject) { 
     console.log("1st"); 
     //resolve(); - How do I do this outside of this function? 
    } 

); 

lookup_documents.then(
    function() { 
     console.log("2nd"); 
    } 
); 
+0

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise –

+0

Que voulez-vous dire par « en dehors de la fonction »? Tu ne devrais pas. Faites simplement le premier pas dans cette fonction. – Bergi

Répondre

0

Normalement, vous utilisez new Promise() lorsque vous souhaitez envelopper une fonction asynchrone en une promesse, comme:

new Promise((resolve, reject) => { 
    makeAjaxCall((err, data) => { 
     if(err) return reject(err); 
     else return resolve(data); 
    }) 
}); 

Il existe d'autres implémentations de Promise, comme q, où vous pouvez créer un « différée "objet qui renvoie une promesse ... Quelque chose de similaire serait:

function makeAjaxCallPromise() { 
    let deferred = Q.defer(); 
    makeAjaxCall((err, data) => { 
     if(err) return deferred.reject(err); 
     else return deferred.resolve(data); 
    }); 
    return deferred.promise; 
} 

Pour la chose spécifique que vous voulez ... Tout ce que je peux penser est de déclarer une variable en dehors du champ de la fonction promesse et ASIGN, quelque chose comme:

let resolver, rejecter; 
new Promise((resolve, reject) => { 
    resolver = resolve; 
    rejecter = reject; 
}); 
makeAjaxCall((err, data) => { 
    if(err) return resolver(err); 
    else return rejecter(data); 
}); 

Mais cela ne semble pas trop bon et peut conduire à des erreurs ... Essayez de tout envelopper dans votre fonction Promise.

0

Vous pouvez le faire comme ceci, en utilisant votre exemple - si je vous comprends bien.

var lookup_documents = function() { 
    return new Promise(function(resolve, reject) { 
    console.log("1st"); 
    resolve(); 
    }); 
}; 

lookup_documents().then(function() { 
    console.log("2nd"); 
}); 
+0

Ceci est parfait, a bien fonctionné. Pour clarifier davantage ici, j'essayais d'appeler une fonction dans la première partie de la promesse qui effectuait un appel d'API, et je voulais résoudre la première partie de la promesse après que l'API soit terminée (dans une fonction séparée). –

+0

Avez-vous été capable de comprendre cela? Sinon, je peux changer ma réponse avec une solution pour cela. –

+0

J'ai pris la suggestion ci-dessus et placé l'API dans la première partie de la promesse, puis le résoudre à la fin de l'appel de l'API. Pour lancer l'appel de l'API, j'utilise la deuxième partie du code fournie ici avec des commandes insérées pour effectuer en fonction d'une résolution réussie de la première partie de la promesse. - Merci, ça a fait ma journée! –