لا يمكن تعيين رأس في كوا عند استخدام رد الاتصال

StackOverflow https://stackoverflow.com//questions/22037287

  •  21-12-2019
  •  | 
  •  

سؤال

عملت مؤخرا على مشروع جديد يستخدم عمليات رد جافا سكريبت.وكنت أستخدم كوا الإطار.ولكن عندما دعوت هذا الطريق :

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() يستغرق بعض الوقت للعودة ولكن كوا ليست على علم بذلك ويستمر مع تدفق السيطرة.هذا في الأساس ما yield هو ل.

تشمل الأشياء" القابلة للإنتاج " الوعود والمولدات والأشواك (من بين أمور أخرى).

أنا شخصيا أفضل إنشاء وعد يدويا مع مكتبة 'كيو'.ولكن يمكنك استخدام أي مكتبة وعد أخرى أو node-thunkify لإنشاء ثونك.

هنا هو مثال قصير ولكن العمل مع 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top