Как применить REPL node.js в анонимной функции?

К сожалению, я ничего не знаю о node.js, потому что до сих пор я использовал Ruby и его REPL под названием Pry. Я обнаружил, что в node.js также есть такие пакеты, которые могут быть установлены менеджером пакетов "npm". Моя причина для этого - пакет node.js "facebook-chat-api", который полезен для программной отправки сообщений чата в Facebook, и, насколько я знаю, этого не может быть достигнуто в Ruby (или, возможно, на других языках), Я установил пакет, найденный здесь https://www.npmjs.com/package/facebook-chat-api и попробовал его с успехом, помогите с примерами (face.js и я запустил его с "node face.js"):

var login = require("facebook-chat-api");

login({email: "XXX.XXX@XXX.XX", password: "XXXXXX"}, function(err,api) {
    if(err) return console.error(err);
    var yourID = "000000000000000";
    var msg = {body: "Hey! My first programmatic message!"};
    api.sendMessage(msg, yourID);
});

После установки правильного идентификатора для пользователя это сработало и отправило сообщение без изъянов. Затем я также установил REPL, называемый "locus" ( https://www.npmjs.com/package/locus), потому что я хотел бы остановить скрипт node.js после отправки сообщения и отправить еще один из командная строка REPL. Итак, мой сценарий стал следующим:

var login = require("facebook-chat-api");
var locus = require('locus')

login({email: "XXX.XXX@XXX.XX", password: "XXXXXX"}, function(err,api) {
    if(err) return console.error(err);
    var yourID = "000000000000000";
    var msg = {body: "Hey! My first programmatic message!"};
    api.sendMessage(msg, yourID);
    eval(locus);
});

К сожалению, мой второй скрипт не работает так, как я ожидал. Я действительно получаю приглашение REPL "locus", но сообщение чата в Facebook не отправляется, пока я не выйду из REPL с помощью команды "quit". Я хотел бы остановить свой сценарий точно после того, как сообщение было отправлено, я хочу получить приглашение REPL, а затем, если возможно, снова вызвать "api.sendMessage" из REPL. Что я могу сделать или как я могу реструктурировать свой скрипт, чтобы он работал так, как я ожидаю. Может быть, поместить анонимную функцию в настоящую именованную функцию, но я не знаю, как это сделать правильно.

1 ответ

Решение

Я сделал небольшой тест, который использует setTimeout для асинхронного запроса и фальшивый отправляет запросы, пока вы все еще находитесь в локусе.

Это код:

var locus = require('locus');

function login () {
    setTimeout(function () {
        console.log('message sent');
    },2000);
}

login();

eval(locus);

И это консоль со мной, набрав несколько команд.

——————————————————————————————————————————————————————————————————————————
3 : function login () {
4 :     setTimeout(function () {
5 :         console.log('message sent');
6 :     },2000);
7 : }
8 : 
9 : login();
10 : 
ʆ: message sent   //  2 seconds after the repl opened the first message sent
typeof login
'function'        //  locus is aware of the login function
ʆ: login();
login();          //  run the login function
undefined
ʆ: message sent   //  the message was (fake) sent without quitting
login();          //  test a second send
undefined
ʆ: message sent   //  another message was sent.

Если приведенный выше код показывает ожидаемое вами поведение, ваш код может быть:

var login = require("facebook-chat-api");
var locus = require('locus');

login({email: "XXX.XXX@XXX.XX", password: "XXXXXX"}, loginHandler);

eval(locus);

function loginHandler (err,api) {
    if(err) return console.error(err);
    var yourID = "000000000000000";
    var msg = {body: "Hey! My first programmatic message!"};
    api.sendMessage(msg, yourID);
}
Другие вопросы по тегам