136 votes

utiliser setTimeout sur la chaîne de promesse

Ici, je suis en train d'envelopper ma tête autour de promesses.Ici, sur la première demande, j'extrais un ensemble de liens.et sur la prochaine la demande, je récupère le contenu du premier lien.Mais je veux faire d'un délai avant de retourner en suivant la promesse de l'objet.J'ai donc utiliser setTimeout.Mais il me donne le JSON suivants erreur (without setTimeout() it works just fine)

SyntaxError: JSON.analyser: caractère inattendu à la ligne 1 colonne 1 de l' les données JSON

je voudrais savoir pourquoi il ne parvient pas?

let globalObj={};
function getLinks(url){
    return new Promise(function(resolve,reject){

       let http = new XMLHttpRequest();
       http.onreadystatechange = function(){
            if(http.readyState == 4){
              if(http.status == 200){
                resolve(http.response);
              }else{
                reject(new Error());
              }
            }           
       }
       http.open("GET",url,true);
       http.send();
    });
}

getLinks('links.txt').then(function(links){
    let all_links = (JSON.parse(links));
    globalObj=all_links;

    return getLinks(globalObj["one"]+".txt");

}).then(function(topic){


    writeToBody(topic);
    setTimeout(function(){
         return getLinks(globalObj["two"]+".txt"); // without setTimeout it works fine 
         },1000);
});

218voto

jfriend00 Points 152127

Pour tenir la promesse de la chaîne va, vous ne pouvez pas utiliser setTimeout() comme vous l'avez fait parce que vous n'êtes pas de retour une promesse de l' .then() handler - vous êtes de retour à partir de la setTimeout() rappel qui ne vous rien de bon.

Au lieu de cela, vous pouvez faire un simple petit retard de fonction comme ceci:

function delay(t, v) {
   return new Promise(function(resolve) { 
       setTimeout(resolve.bind(null, v), t)
   });
}

Et, ensuite de l'utiliser comme ceci:

getLinks('links.txt').then(function(links){
    let all_links = (JSON.parse(links));
    globalObj=all_links;

    return getLinks(globalObj["one"]+".txt");

}).then(function(topic){
    writeToBody(topic);
    // return a promise here that will be chained to prior promise
    return delay(1000).then(function() {
        return getLinks(globalObj["two"]+".txt");
    });
});

Ici, vous êtes de retour d'une promesse de l' .then() gestionnaire et donc il est enchaîné de manière appropriée.


Vous pouvez également ajouter une méthode délai à la Promesse de l'objet et ensuite utiliser directement un .delay(x) méthode sur vos promesses comme ceci:

function delay(t, v) {
   return new Promise(function(resolve) { 
       setTimeout(resolve.bind(null, v), t)
   });
}

Promise.prototype.delay = function(t) {
    return this.then(function(v) {
        return delay(t, v);
    });
}


Promise.resolve("hello").delay(500).then(function(v) {
    console.log(v);
});

Ou, utilisez le Bluebird promesse de la bibliothèque qui a déjà l' .delay() méthode intégrée.

104voto

Igor Korsakov Points 549
.then(() => new Promise((resolve) => setTimeout(resolve, 15000)))

72voto

Sébastien Rosset Points 188

La version ES6 plus courte de la réponse:

 const delay = t => new Promise(resolve => setTimeout(resolve, t));
 

Et alors tu peux faire:

 delay(3000).then(() => console.log('Hello'));
 

13voto

AnoopGoudar Points 413

Si vous êtes à l'intérieur d'un bloc .then () et que vous voulez exécuter une settimeout ()

             .then(() => {
                console.log('wait for 10 seconds . . . . ');
                return new Promise(function(resolve, reject) { 
                    setTimeout(() => {
                        console.log('10 seconds Timer expired!!!');
                        resolve();
                    }, 10000)
                });
            })
            .then(() => {
                console.log('promise resolved!!!');

            })
 

comme indiqué ci-dessous

 wait for 10 seconds . . . .
10 seconds Timer expired!!!
promise resolved!!!
 

Bon codage!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X