2015-05-27 3 views
2

У меня есть библиотека, которая подключается к удаленному API:Создание асинхронной функции синхронные для Node.js РЕПЛ

class Client(access_token) { 
    void put(key, value, callback); 
    void get(key, callback); 
} 

Я хочу создать Node.js REPL, чтобы сделать его легко попробовать вещи :

var repl = require('repl'); 
var r = repl.start('> '); 
r.context.client = new Client(...); 

Проблема в том, что асинхронный API не подходит для REPL. Я бы предпочел синхронный, который дает результат через возвращаемое значение и сигнализирует об ошибке с исключением. Что-то вроде:

class ReplClient(access_token) { 
    void put(key, value); // throws NetworkError 
    string get(key);  // throws NetworkError 
} 

Есть ли способ реализации ReplClient с использованием Client? Я бы предпочел избегать любых зависимостей, отличных от стандартных пакетов Node.js.

+0

Я не знаю Repl, но, пожалуйста, проверьте обещания, я обычно использую добротность модуль для выполнения обещаний. С обещаниями вы можете изменить свои функции и сделать их синхронными. Возможно, реплика уже дает обещания. – solick

+0

Наряду с обещаниями вы можете использовать функции генератора для создания синхронного стиля кода с использованием ключевого слова 'yield', работающего с флагом' node --harmony' –

+0

Вам действительно не нужно писать свою собственную обертку repl. Просто запустите узел без какого-либо скрипта, и он войдет в режим repl (без использования модуля repl) – slebetman

ответ

0

Вы можете синхронно ждать вещи с магией wait-for-stuff.

Основываясь на вашем примере спецификации:

const wait = require('wait-for-stuff') 

class ReplClient { 
    constructor(access_token) { 
     this.client = new Client(access_token) 
    } 
    put(key, value) { 
     return checkErr(wait.for.promise(this.client.put(key, value))) 
    } 
    get(key) { 
     return checkErr(wait.for.promise(this.client.get(key))) 
    } 
} 

const checkErr = (maybeErr) => { 
    if (maybeErr instanceof Error) { 
     throw maybeErr 
    } else { 
     return maybeErr 
    } 
} 
Смежные вопросы