Как вернуть ответ Hapi с обещанием и vo.js

У меня есть асинхронный процесс кошмар.js, который использует управление потоком vo.js с генератором:

vo(function *(url) {
  return yield request.get(url);
})('http://lapwinglabs.com', function(err, res) {
  // ... 
})

Это должно вернуть обещание Hapi (v.13.0.0) с интерфейсом reply(). Я видел примеры с Bluebird и другими библиотеками обещаний, например: handler">Как ответить из-за пределов обработчика маршрута hapi.js, но возникли проблемы с адаптацией vo.js. Может ли кто-нибудь привести пример этого?

сервер.js

server.route({
method: 'GET',
path:'/overview', 
handler: function (request, reply) {
    let crawl = scrape.doCrawl({"user": USERNAME, "pass": PASSWORD});
    reply( ... ).code( 200 );
    }
});

скрейп.js

module.exports = {
    DoCrawl: function(credentials) { 
        var Nightmare = require('nightmare');
        var vo = require('vo');

        vo(function *(credentials) {
            var nightmare = Nightmare();
            var result = yield nightmare
               .goto("www.example.com/login")       
               ...
            yield nightmare.end();
            return result

        })(credentials, function(err, res) {
              if (err) return console.log(err);
              return res
        })
    }
};

person MachuPichu    schedule 11.02.2016    source источник
comment
Разве вы не можете создать новое обещание и обернуть в него возвращаемое значение, тогда вы могли бы вызвать ответ с разрешенным значением?! Не очень хорошо с обещаниями, но я видел, как другие используют этот метод при возврате обещаний из обратного вызова ответа hapi.   -  person simon-p-r    schedule 11.02.2016


Ответы (1)


Если вы хотите отправить результат doCrawl в метод hapi reply, вам придется преобразовать doCrawl, чтобы вернуть обещание. Что-то вроде этого (не проверено):

сервер.js

server.route({
method: 'GET',
path:'/overview', 
handler: function (request, reply) {
    let crawl = scrape.doCrawl({"user": USERNAME, "pass": PASSWORD});
    // crawl is a promise
    reply(crawl).code( 200 );
    }
});

скрейп.js

module.exports = {
    doCrawl: function(credentials) { 
        var Nightmare = require('nightmare');
        var vo = require('vo');

        return new Promise(function(resolve, reject) {

            vo(function *(credentials) {
                var nightmare = Nightmare();
                var result = yield nightmare
                   .goto("www.example.com/login")       
                   ...
                yield nightmare.end();
                return result

            })(credentials, function(err, res) {
                // reject the promise if there is an error
                if (err) return reject(err);
                // resolve the promise if successful
                resolve(res);
            })
        })
    }
};
person mikefrey    schedule 11.02.2016