Koajs дают возвращаемое значение функции

В expressjs я обычно использую асинхронную функцию, как показано ниже:

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?


person kenticny    schedule 05.04.2016    source источник
comment
Честно говоря, я немного удивлен, что это вообще работает, поскольку обычно вы не можете получить обычные функции с помощью ко. Koajs должны выполнять какие-то манипуляции, которые позволяют вам получать обычные функции. В любом случае, я на самом деле не вижу массив, который вы видите. Какую версию коа вы используете?   -  person dvlsg    schedule 06.04.2016


Ответы (1)


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

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();

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

person dvlsg    schedule 05.04.2016