【问题标题】:Koajs yield the function return valueKoajs 产生函数返回值
【发布时间】:2016-04-05 20:16:40
【问题描述】:

在 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 中获得期望值?

【问题讨论】:

  • 老实说,我有点惊讶它的工作原理,因为你通常不能使用co 生成常规函数。 Koajs 必须进行某种操作,使您能够生成常规函数。无论哪种方式,我实际上都没有看到您正在看到的数组。你用的是什么版本的 koa?

标签: javascript node.js koa


【解决方案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,但如果您只需要涵盖其中的几个,您自己就可以很简单地完成。

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 2015-12-07
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多