Bluebird обещание `promisifyAll` не работает - невозможно прочитать свойство` then`
Я использую модуль node, который использует соглашение об обратном вызове node. Я хочу преобразовать этот модуль в API с помощью Bluebird promises. Я не понимаю, как это сделать.
Ниже приведена функция обратного вызова стиля node. Я хочу превратить его в надежное обещание синей птицы.
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;
}
});
Я пробовал этот путь с помощью PromisifyAll
, но он не работает:
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);
});
Я получаю ошибки then is not a function
. Как я могу это исправить?
Ответы
Ответ 1
Когда bluebird преобразует модуль (например, xml2js) в API, основанный на обещании, используя promisifyAll
, то он добавляет суффикс Async
к каждому имени функции и добавляет эту функцию в этот объект:
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);
});
Когда вы вызываете parseString
без суффикса async, он вызывает исходную функцию на основе обратного вызова.