2017-08-20 21 views
5

Trong chương trình của tôi, tôi làm async gọi cho chức năng của tôi từ một mô-đun API:yêu cầu đúng với async/chờ đợi trong Node.js

var info = await api.MyRequest(value); 

Mã Module:

var request = require("request") 

module.exports.MyRequest = async function MyRequest(value) { 
    var options = { 
     uri: "http://some_url", 
     method: "GET", 
     qs: { // Query string like ?key=value&... 
      key : value 
     }, 
     json: true 
    } 

    try { 
     var result = await request(options); 
     return result; 
    } catch (err) { 
     console.error(err); 
    } 
} 

Thực hiện trả về ngay lập tức , tuy nhiên, result và do đó info chứa đối tượng yêu cầu và yêu cầu nội dung - info.body như key=value&..., không phải là nội dung phản hồi bắt buộc.

Tôi đang làm gì sai? Làm thế nào để khắc phục? Điều gì là thích hợp request sử dụng với async, hoặc nó chỉ hoạt động chính xác với những lời hứa như đã đề cập ở đây: Why await is not working for node request module? Bài viết sau đây đã đề cập là có thể: Mastering Async Await in Node.js.

+0

'async' và 'tác await' trong nodejs 7 mới nhất xây dựng. vì vậy hãy chắc chắn rằng bạn đã xây dựng mới nhất của nodejs 7. Để biết thêm thông tin bạn có thể tham khảo liên kết này https://blog.risingstack.com/async-await-node-js-7-nightly – Aabid

+0

@Aabid Tôi có Node.js 8.4 –

Trả lời

11

Bạn cần sử dụng mô-đun request-promise, không phải mô-đun request.

await hoạt động trên các hàm trả về lời hứa chứ không phải trên các hàm trả về đối tượng request và mong bạn sử dụng gọi lại hoặc trình xử lý sự kiện để biết khi nào mọi việc được thực hiện.

Module request-promise hỗ trợ các tính năng giống như các mô-đun request, nhưng chức năng không đồng bộ trong nó trở lại hứa hẹn, do đó bạn có thể sử dụng một trong hai .then() hoặc await với họ chứ không phải là callbacks rằng mô-đun request hy vọng.

Vì vậy, cài đặt request-promise module và sau đó thay đổi này:

var request = require("request"); 

này:

var request = require("request-promise"); 
0

Đẹp, chắc chắn bạn cũng có thể làm như sau. Nếu những gì bạn cần không trả lại Lời hứa theo mặc định, bạn có thể cung cấp thông qua phương thức Promise mới. Trên câu trả lời là ít tiết mặc dù.

async function getBody(url) { 
 
    const options = { 
 
    url: url, 
 
    method: 'GET', 
 
    }; 
 

 
    // Return new promise 
 
    return new Promise(function(resolve, reject) { 
 
    // Do async job 
 
    request.get(options, function(err, resp, body) { 
 
     if (err) { 
 
     reject(err); 
 
     } else { 
 
     resolve(body); 
 
     } 
 
    }) 
 
    }) 
 
}

Các vấn đề liên quan