2015-05-06 16 views
11

Tôi đang sử dụng mô-đun nút sử dụng quy ước gọi lại nút. Tôi muốn chuyển đổi mô-đun này thành một API sử dụng lời hứa Bluebird. Tôi không nhận được làm thế nào để làm điều này.Lời hứa Bluebird `promisifyAll` không hoạt động - không thể đọc thuộc tính` then`

Dưới đây là chức năng gọi lại kiểu nút của tôi. Tôi muốn chuyển đổi nó thành lời hứa của bluebird.

var module = require('module'); // for example xml2js, or Mongoose 
var parseString = xml2js.parseString; 
    parseString(xml, function (err, result) { // the regular API 
     if (err) { 
     console.log("Error in generation json from xml"); 
     } else { 
     return result; 
     } 
    }); 

tôi đã cố gắng theo cách này sử dụng PromisifyAll nhưng nó không làm việc:

var module = Promise.promisifyAll(require('module')); // for example xml2js 
xml2js.parseString(xml) 
     .then(function (result) { 
      console.log("result = ", result); 
     }) 
     .catch(function (err) { 
      console.err(err); 
     }); 

Tôi nhận được then is not a function lỗi. Làm thế nào tôi có thể sửa chữa nó?

Trả lời

17

Khi bluebird chuyển đổi một module (như xml2js) vào một API dựa lời hứa sử dụng promisifyAll sau đó nó gắn thêm một hậu tố Async cho mỗi tên hàm và thêm chức năng đó vào đối tượng đó:

var xml2js = Promise.promisifyAll(require('xml2js')); // example: xml2js 
xml2js.parseStringAsync(xml) // NOTE THE ASYNC SUFFIX 
     .then(function (result) { 
      console.log("result = " + JSON.stringify(result)); 
     }) 
     .catch(function (err) { 
      console.err(err); 
     }); 

Khi bạn gọi parseString không hậu tố async, nó gọi hàm gốc gọi lại ban đầu.

+0

Tôi đã sử dụng promisifyAll với yêu cầu và không yêu cầu tôi thêm hậu tố Async. Có lý do cụ thể nào không? – Antoine

+0

@AnthonyMayfield Tôi nghĩ mô-đun yêu cầu theo mặc định được thực hiện bằng các khái niệm hứa hẹn. Tôi đã sử dụng .theo yêu cầu mà không cần quảng cáo –

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