2016-08-03 21 views
0

Ich versuche, das Folgende zu tun, aber es funktioniert nicht. Wie kann ich den Code anpassen, um eine Verzögerung zwischen .then und .done zu haben?Verzögerung verkettet Versprechen

myService.new(a).then(function(temp) { 

     setTimeout(function() { 
      return myService.get(a, temp); 
     }, 60000); 
    }).done(function (b) { 
     console.log(b); 
    }); 
+1

Was Versprechen Bibliothek verwenden Sie? – Bergi

+0

Erstellen Sie ein neues Versprechen im 'then' Handler und geben Sie es vom' then' Handler zurück, dann im 'timer' lösen Sie das neue Versprechen, das den' done' Handler ausführt –

Antwort

1

Sie können eine einfache Delay-Funktion erstellen, die ein Versprechen zurück und verwenden Sie diese in Ihrem Versprechen Kette:

function delay(t, val) { 
    return new Promise(function(resolve) { 
     setTimeout(function() { 
      resolve(val); 
     }, t); 
    }); 
} 

myService.new(a).then(function(temp) { 
    return delay(60000, temp); 
}).then(function(temp) { 
    return myService.get(a, temp); 
}).then(function (b) { 
    console.log(b); 
}); 

Sie könnten auch erweitern den Promise Prototyp mit einer .delay() Methode (die einige Versprechen Bibliotheken wie Bluebird bereits eingebaut haben). Beachten Sie, diese Version der Verzögerung geht auf den Wert, den es auf die nächste Glied in der Kette gegeben:

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

Dann können Sie dies nur tun:

myService.new(a).delay(60000).then(function(temp) { 
    return myService.get(a, temp); 
}).then(function (b) { 
    console.log(b); 
}); 
0

Sie eine .delay() Funktion erstellen Setzen Sie auf Promise.prototype, die einen neuen Promise Wert der ursprünglichen Versprechen zurückgibt.

Promise.prototype.delay = function(t) { 
 
    return this.then(function(data) { 
 
    return new Promise(function(resolve) { 
 
     setTimeout(resolve, t || 0, data); 
 
    }) 
 
    }) 
 
}; 
 

 
Promise.resolve(123) 
 
.delay(6000) 
 
.then(function(data) { 
 
    console.log(data) 
 
});

+1

'setTimeout (resolve, t || 0, Daten); 'für den Gewinn –

+1

Kleinerer Code ist schöner Code ※ –

0

Eine leicht verbesserte Version des Ansatzes der jfriend00 vermeidet die um den aufgelösten Wert wie folgt übergeben:

function delay(t) { 
    return (val) => { 
    return new Promise((resolve, reject) => { 
     setTimeout(() => resolve(val), t) 
    }) 
    } 
} 

kann wie folgt verwendet werden:

myService.new(a) 
    .then(delay(60000)) 
    .then(function(temp) { 
    return myService.get(a, temp); 
    }).then(function (b) { 
    console.log(b); 
    });