2015-01-15 12 views
9

Ich versuche es6 Versprechen mit Superagenten zu verwenden. Ich versuche eine Funktion aufzurufen, die eine superanitäre Anforderung enthält.Versprechen es6 und superagent

Request.post(buildReq).then(res => { 
if (res.ok) {//process res} 
}); 

Hier ist die Funktion Verpackung Superagent

static post(params) { 
    superagent 
     .post(params.url) 
     .send(params.payload) 
     .set('Accept', 'application/json') 
     .end((error, res) => { 
     return this.Promise.resolve(res); 
     }) 
     .bind(this); 
    } 

Ich erhalte eine Fehlermeldung

enter code here Uncaught TypeError: Cannot read property 'then' of undefined

Wenn ich die Rückkehr der Funktion

static post(params) { 
    return Promise.resolve(superagent 
     .post(params.url) 
     .auth(params.auth.username, params.auth.password) 
     .send(params.payload) 
     .set('Accept', 'application/json') 
     .end((error, res) => { 
     return this.Promise.resolve(res); 
     }) 
    ); 
    } 
ändern

Es sieht so aus, als ob die Daten in den Dev-Tools meines Browsers zurückgegeben werden, aber ich kann nicht innerhalb der .then-Funktion darauf zugreifen. Wie kann ich die Antwort aus dem Versprechen bekommen?

Antwort

25

Es spielt keine Rolle, was Sie vom Methodenrückruf end zurückgeben, da es asynchron ausgeführt wird, wenn Sie eine Antwort erhalten und das Ergebnis der Rückrufausführung nirgends verwendet wird. Suchen Sie im Quellcode nach here und here. end Methode gibt this zurück, so in Ihrem zweiten Beispiel lösen Sie superagent keine Antwort. Um die Antwort Ihre post Methode muss zu erhalten wie folgt aussieht:

static post(params) { 
    return new Promise((resolve, reject) => { 
     superagent 
      .post(params.url) 
      .auth(params.auth.username, params.auth.password) 
      .send(params.payload) 
      .set('Accept', 'application/json') 
      .end((error, res) => { 
       error ? reject(error) : resolve(res); 
      }); 
    }); 
} 
+0

super Lösung für viele Anfragen benötigen. – Sinux

4

Manchmal möchten Sie eine Einzugsebene zu vermeiden, verursacht durch new Promise(...) dann können Sie direkt Promise.reject und Promise.resolve verwenden.

static post(params) { 
    return superagent 
      .post(params.url) 
      .auth(params.auth.username, params.auth.password) 
      .send(params.payload) 
      .set('Accept', 'application/json') 
      .end((error, res) => { 
       return error ? Promise.reject(error) : Promise.resolve(res); 
      }); 
    }); 
} 
0

Dies ist eine consise Version, falls Sie es

import request from "superagent"; 

const withPromiseCallback = (resolve, reject) => (error, response) => { 
    if (error) { 
    reject({error}); 
    } else { 
    resolve(response.body); 
    } 
}; 

export const fetchSuggestions = (search) => new Promise((resolve, reject) => 
request. 
    get("/api/auth/get-companies/0/50"). 
    type("form"). 
    set("Accept", "application/json"). 
    query({ 
     search, 
    }). 
    end(withPromiseCallback(resolve, reject)) 
); 

export const fetchInitialInformation =() => new Promise((resolve, reject) => 
    request. 
    get("/api/auth/check"). 
    set("Accept", "application/json"). 
    end(withPromiseCallback(resolve, reject)) 
); 
Verwandte Themen