2015-01-15 21 views
9

Tôi đang cố gắng sử dụng các lời hứa es6 với superagent. Tôi đang cố gắng gọi một hàm có yêu cầu superagent được bao bọc bên trong.Hứa hẹn es6 và superagent

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

Dưới đây là chức năng gói 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); 
    } 

Tôi nhận được một lỗi

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

Khi tôi thay đổi sự trở lại của các chức năng để

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); 
     }) 
    ); 
    } 

Có vẻ như dữ liệu được trả lại trong các công cụ tìm kiếm của trình duyệt của tôi, nhưng tôi không thể truy cập nó trong hàm .then. Làm thế nào tôi có thể nhận được phản hồi từ lời hứa.

Trả lời

25

Không quan trọng bạn đang quay trở lại từ phương thức gọi lại phương thức end vì nó được thực thi không đồng bộ khi bạn nhận được phản hồi và kết quả thực hiện gọi lại không được sử dụng. Hãy xem herehere trong mã nguồn. end phương thức trả về this, vì vậy trong ví dụ thứ hai của bạn, bạn đang giải quyết superagent không phản hồi. Để có được câu trả lời post phương pháp của bạn phải trông giống như:

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

giải pháp tuyệt vời. – Sinux

4

Đôi khi bạn muốn tránh một mức độ thụt đầu dòng do new Promise(...) sau đó bạn có thể sử dụng trực tiếp Promise.rejectPromise.resolve.

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

Đây là một phiên bản consise hơn, trong trường hợp bạn cần nó cho rất nhiều yêu cầu

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)) 
); 
Các vấn đề liên quan