@Hider998

Как затормозить выполнение javascript до получения callback?

Для того чтобы получить данные для страницы, сервер отправляет запрос в базу данных. Результат приходит в виде callback, с переменной, в которой хранится JSON объект.
JSON объект должен использоваться при рендеринге страницы. Но при запуске страница рендерится быстрее, чем приходит callback. Как можно приостановить функцию до получения Callback?

Код javascript:
var Datastore, JPug, Pug, app, async, db, engine, findPage, koa, page;

async = require('async');
Datastore = require('nedb');

db = {};
db.pages = new Datastore({
    filename: 'DB/pages/index.db',
    autoload: true
});

koa = require('koa');
app = koa();

Pug = require('koa-pug');
engine = new Pug({
    viewPath: './views',
    debug: false,
    pretty: true,
    compileDebug: false,
    locals: {},
    basedir: __dirname + '/public',
    app: app
});

findPage = function(req, json) {
    db.pages.find({
        url: req
    }, function(err, docs) {
        console.log(docs);
        json = docs; // Искомые данные для страницы
    });
};

app.use(function *() {
    'use strict';
    var json, req;
    req = this.request.url;
    console.log(req);
    async.series([
        findPage(req, json), 
        page = this.render('index', {page: json}, true) // рендер страницы
    ], function() {
        return page;
    });
});

app.listen(3000);

При запуске кода приходит ошибка рендеринга, т.к переменная json не определена. А после выдается полученный callback:

172a947e67f34b7f902f80b308a2fb18.png
Надеюсь на ваши идеи и замечания. Заранее спасибо.
  • Вопрос задан
  • 371 просмотр
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Никак.
Запрос выполняется асинхронно. Вам нужно запускать рендер после получения ответа, или переписать все так, чтобы эти данные были необязательными на момент начала рендера.
Ответ написан
Комментировать
findPage = function(req, json, cb) {
    db.pages.find({
        url: req
    }, function(err, docs) {
        if (err) cd(err);
        console.log(docs);
        json = docs; // Искомые данные для страницы
        cb(null, json)
    });
};

app.use(function *() {
    'use strict';
    var json, req;
    req = this.request.url;
    console.log(req);
    findPage(req, json, function(err, data) {
        if (err) throw err;
        page = this.render('index', {page: data}, true) // рендер страницы
    });
});

И вы тут используете async, его бы юзали для последовательного выполнения задач.
https://github.com/caolan/async#seriestasks-callback
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы