2016-11-21 3 views
0

Ich muss eine Verzögerung zu einem API-Aufruf hinzufügen, damit ich setTimeout verwende. Nach 2 Sekunden auf Erfolg, muss ich res.status(200).json(response) zurückgeben.Auflösen eines setTimeout im API-Endpunkt

exports.someEndpoint = function(req, res) { 
    return request.post({ 
     url: //etc 
    }) 
    .then(function(response) { 
     return new Promise(function(resolve, reject) { 
     setTimeout(function() { 
      // is this right? 
      resolve(
      res.status(200).json(response); 
     ); 
     }, 2000); 
     }); 
    }); 
    }; 

Meine Frage ist: kann ich resolve innerhalb des setTimeout anrufen müssen? Oder kann ich es einfach komplett weglassen?

Antwort

2

Ihr Code entspricht:

exports.someEndpoint = function(req, res) { 
    return request.post({ 
     url: //etc 
    }) 
    .then(function(response) { 
     setTimeout(function() { 
      res.status(200).json(response); 
     }, 2000); 
    }); 
    }; 

Aber nur, weil es ein Express Route-Handler, der erwartet wird nichts im Allgemeinen oder ein Versprechen insbesondere zurückzukehren.

Auf der anderen Seite Code:

exports.someEndpoint = function(req, res) { 
    return request.post({ 
     url: //etc 
    }) 
    .then(function(response) { 
     return new Promise(function(resolve, reject) { 
     setTimeout(function() { 
      // is this right? 
      resolve(
      res.status(200).json(response); 
     ); 
     }, 2000); 
     }); 
    }); 
    }; 

bezeichnet werden könnte als:

yourModule.someEndpoint(req, res).then(function() { 
    // code to run after the timeout 
}); 

, die in der kürzeren Version nicht möglich wären.

0

Muss ich die Auflösung in setTimeout aufrufen?

Es hängt davon ab, was mit exports.someEndpoint passieren wird, aber in der Regel ja - Sie wollen ein Versprechen zurück, das alle Asynchron-Vorgänge abgeschlossen hat darin Zustand erfüllt ist.

Wenn Ihr Express-Handler beispielsweise von einer Funktion erfasst wird, die eine Zusage erwartet, wird der Fluss fortgesetzt, bevor Sie eine Antwort an Ihren Benutzer gesendet haben.

Wenn Sie Versprechen in Ihrem Anforderungshandler nicht kümmern, dann können Sie auch nicht return request.post({ und nur nichts zurückgeben.

Verwandte Themen