2017-01-02 2 views
0

Ich muss zwei http Anfragen. Die zweite HTTP-Anforderung erfordert Informationen von der ersten. Die erste Anforderung besteht darin, die Variable "Betrag" zu setzen, die während der zweiten Anfrage verwendet wird.Wie verwende ich Versprechen für eine einzelne Variable?

Dies ist ein Codeabschnitt von mir.

(die Variablen ‚url‘ und ‚Zahl‘ sind vorhanden, foo() ist etwas anderes.)

var Promise = require('bluebird'); 
var request = require('request-promise'); 
var amount; 


request({url: url, json: true }, function(error, response, body) { 
      if (!error && response.statusCode == 200) { 
      amount = body.num; 
      } 
     }).then(function(data) { 
      if (number == null || number > amount) { 
      number = Math.floor(Math.random() * amount) + 1; 
      } 

      request({ 
      url: url, 
      json: true 
      }, function(error, response, body) { 
      if(!error & response.statusCode == 200) { 
       foo(); 
      } 
      }); 
     }); 

der Code funktioniert, aber es ist nicht schön mit dieser Verschachtelung von Anfragen. Gibt es eine Möglichkeit, eine Variable zu versprechen und dann eine Funktion auszulösen, wenn diese Variable gesetzt wurde?

+0

Sie verwenden ['request-promise'] (https://github.com/request/request-promise), verwenden aber trotzdem einen nicht-versprechenden Rückruf. Warum? –

+0

Woher kommt 'number'? –

Antwort

2

Sie verwenden request-promise, aber immer noch mit altmodischen Callbacks, weshalb die Dinge so überladen aussehen.

Es ist schwer zu verstehen, was Sie zu tun versuchen, aber wenn die zweite Anforderung von der ersten auf Informationen beruht, Sie ihn in einem then Rückruf und senden Sie das neue Versprechen gibt es Ihnen:

var Promise = require('bluebird'); 
// I changed `request` to `rp` because `request-promise` is not `request`, that's one of its underlying libs 
var rp = require('request-promise'); 

// Do the first request 
rp({ url: url, json: true }) 
    .then(function(data) { 
     // First request is done, use its data 
     var amount = data.num; 
     // You didn't show where `number` comes from, assuming you have it in scope somewhere... 
     if (number == null || number > amount) { 
      number = Math.floor(Math.random() * amount) + 1; 
     } 
     // Do the next request; you said it uses data from the first, but didn't show that 
     return rp({ url: url, json: true }); 
    }) 
    .then(function() { // Or just `.then(foo);`, depending on your needs and what `foo` does 
     // Second request is done, use its data or whatever 
     foo(); 
    }) 
    .catch(function(error) { 
     // An error occurred in one of the requests 
    }); 
+0

vielen Dank! es hat mir geholfen :) – ivsterr

Verwandte Themen