Как применить 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);
}