最近我在做一个使用 javascript 回调的新项目。我正在使用koa框架。但是当我调用这条路线时:
function * getCubes(next) {
var that = this;
_OLAPSchemaProvider.LoadCubesJSon(function(result) {
that.body = JSON.stringify(result.toString());
});
}
我收到此错误:
_http_outgoing.js:331
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:331:11)
at Object.module.exports.set (G:\NAP\node_modules\koa\lib\response.js:396:16)
at Object.length (G:\NAP\node_modules\koa\lib\response.js:178:10)
at Object.body (G:\NAP\node_modules\koa\lib\response.js:149:19)
at Object.body (G:\NAP\node_modules\koa\node_modules\delegates\index.js:91:31)
at G:\NAP\Server\OlapServer\index.js:42:19
at G:\NAP\Server\OlapServer\OLAPSchemaProvider.js:1599:9
at _LoadCubes.xmlaRequest.success (G:\NAP\Server\OlapServer\OLAPSchemaProvider.js:1107:13)
at Object.Xmla._requestSuccess (G:\NAP\node_modules\xmla4js\src\Xmla.js:2110:50)
at Object.ajaxOptions.complete (G:\NAP\node_modules\xmla4js\src\Xmla.js:2021:34)
问题是你的异步调用LoadCubesJSon()
需要一段时间才能返回,但 Koa 没有意识到这一点并继续控制流程。基本上就是这样yield
is for.
“可生成”对象包括 Promise、生成器和 thunk(等等)。
我个人更喜欢手动创建一个承诺“Q”库。但你可以使用任何其他承诺库或node-thunkify创建一个 thunk。
这是简短但有效的示例Q
:
var koa = require('koa');
var q = require('q');
var app = koa();
app.use(function *() {
// We manually create a promise first.
var deferred = q.defer();
// setTimeout simulates an async call.
// Inside the traditional callback we would then resolve the promise with the callback return value.
setTimeout(function () {
deferred.resolve('Hello World');
}, 1000);
// Meanwhile, we return the promise to yield for.
this.body = yield deferred.promise;
});
app.listen(3000);
所以你的代码将如下所示:
function * getCubes(next) {
var deferred = q.defer();
_OLAPSchemaProvider.LoadCubesJSon(function (result) {
var output = JSON.stringify(result.toString());
deferred.resolve(output);
});
this.body = yield deferred.promise;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)