2016-04-05 5 views
0

В expressjs, я обычно использую асинхронную функцию, как показано ниже:Koajs дают возвращаемое функцией значение

function foo(callback) { 
    var bar = {a: 1, b: 2}; 
    callback(null, bar); 
} 

foo(function(err, result) { 
    // result is {a: 1, b: 2} 
}); 

В Koajs, я использую yield в функции маршрутизации, как показано ниже:

function foo(callback) { 
    var bar = {a: 1, b: 2}; 
    callback(null, bar); 
} 
var result = yield foo.bind(null); // [{a: 1, b: 2}] 

Я ожидаю, результатом является {a: 1, b: 2}, но в результате получается массив [{a: 1, b: 2}].

Итак, как я могу получить значение ожидания в koajs?

+0

Честно говоря, я немного удивлен, что это работает вообще, поскольку вы обычно не можете выполнять регулярные функции с помощью [co] (https://github.com/tj/co#yieldables). Коадж должен делать какую-то манипуляцию, которая позволяет вам выполнять регулярные функции. В любом случае, я на самом деле не вижу массив, который вы видите. Какую версию koa вы используете? – dvlsg

ответ

0

Коа против Co махинаций в стороне, вы должны действительно promisify ваших методов асинхронных, предпочтительно путем изменения исходных функций (если это возможно для вас):

function foo() { 
    let bar = { a: 1, b: 2 }; 
    return Promise.resolve(bar); 
} 

let data = yield foo(); 

Если это не возможности (слишком много функции для преобразования, по-прежнему используются в качестве функции обратного вызова в другом месте, используя чужие функцию и т.д.), вы можете обернуть их, как это:

function fooPromise() { 
    return new Promise((resolve, reject) => { 
     // assume foo is defined externally 
     foo((err, result) => { 
      if (err) 
       return reject(err); 
      return resolve(result); 
     }); 
    }); 
} 

let data = yield fooPromise(); 

Есть некоторые библиотеки, которые обертывают методы обратного вызова для вас, s uch как bluebird, но это довольно просто сделать, если есть только несколько, чтобы покрыть.

Смежные вопросы