BAS_API в Node js



  • Асинхронный код в node js. BAS_API не выполняется. Отдельно проверял, работает, а здесь нет.

    all_ws[ws].on('message', function incoming(data) {
        if (data != 3) {
            var array = data.match(/([|{).*(]|})/g)[0];
            var msg = JSON.parse(array);
            if (msg[0] == 'message') {
                if (msg[1].user_login === "ara") {
                    switch (msg[1].message) {
                        case "up":
                            BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(1))");
                            break;
                        case "down":
                            BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(-1))");
                            break;
                        default:
                    }
                } else {
                }
            }
        }
    });
    


  • @vanarok said in BAS_API в Node js:

    Асинхронный код в node js. BAS_API не выполняется. Отдельно проверял, работает, а здесь нет.

    Так и есть, если не оборачивать все в промис и не ждать выполения через await, то функции БАС в таком коде не сработают.



  • @UserTrue пытался с await , но выдает ошибку синтаксиса



  • @vanarok said in BAS_API в Node js:

    @UserTrue пытался с await , но выдает ошибку синтаксиса

    С await будет работать. Скорее всего вы неправильно его добавили
    https://community.bablosoft.com/topic/4450/websocket-на-node-js/6



  • @Fox

    switch (data.message) {
    case "plus":
    
    await(new Promise((resolve, reject) => {
    BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(1))");
    resolve()     
    }));
    
    break;
    case "minus":
    
    await(new Promise((resolve, reject) => {
    BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(-1))");
    resolve()         
    }));
    
    break;
    default:
    }
    } else {
    }
    

    пробовал так: синхронный код в асинхронном, такое вообще реально?



  • @vanarok said in BAS_API в Node js:

    @Fox

    switch (data.message) {
    case "plus":
    
    await(new Promise((resolve, reject) => {
    BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(1))");
    resolve()     
    }));
    
    break;
    case "minus":
    
    await(new Promise((resolve, reject) => {
    BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(-1))");
    resolve()         
    }));
    
    break;
    default:
    }
    } else {
    }
    

    пробовал так: синхронный код в асинхронном, такое вообще реально?

    Выложите весь код, а лучше тестовый проект, так будет просто быстрее



  • @Fox

    WebSocket = require('socket.io-client');
    var ws = "ws" + [[CHILD]];
    var SocksProxyAgent = require('https-proxy-agent');
    var endpoint = 'wss://test..ru/';
    var options = {
      host: [[PROXY]].split(":")[0],
      port: [[PROXY]].split(":")[1],
      protocol: 'http',
      transports: ['websocket'],
    }
    var agent = new SocksProxyAgent(options);
    all_ws[ws] = new WebSocket(endpoint, { agent: agent });
    
    all_ws[ws].on('connect', () => {
      all_ws[ws].on('message', (data) => {
        if (data.user_login === "User") {
          switch (data.message) { 
            case "plus":
              await(new Promise((resolve, reject) => {
                BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(1))");
              resolve()     
              }));
              break;
            case "minus":
              await(new Promise((resolve, reject) => {
                BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(-1))");
              resolve()     
              }));
              break;
            default:
          }
        } else {
         
        }
      });
    });
    

    тестовый не получится, у него много зависимостей, проще костыль сделать, чем этим заниматься



  • @vanarok said in BAS_API в Node js:

    @Fox
    тестовый не получится, у него много зависимостей, проще костыль сделать, чем этим заниматься

    Попробуй вот так:

    await(new Promise((resolve, reject) => {
        WebSocket = require('socket.io-client');
        var ws = "ws" + [[CHILD]];
        var SocksProxyAgent = require('https-proxy-agent');
        var endpoint = 'wss://test..ru/';
        var options = {
            host: [[PROXY]].split(":")[0],
            port: [[PROXY]].split(":")[1],
            protocol: 'http',
            transports: ['websocket'],
        }
        var agent = new SocksProxyAgent(options);
        all_ws[ws] = new WebSocket(endpoint, { agent: agent });
        all_ws[ws].on('connect', () => {
            all_ws[ws].on('message', (data) => {
                if (data.user_login === "User") {
                    switch (data.message) {
                        case "plus":
                            BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(1))");
                            resolve()
                        case "minus":
    
                            BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(-1))");
                            resolve()
                        default:
                    }
                }
            });
        });
    
    }));
    


  • @Fox ну такое, суть моего кода в асинхронности, полностью синхронный мне не нужен).



  • Я так понимаю тут никак не выкрутится без завершения всего кода node js.



  • @vanarok said in BAS_API в Node js:

    Я так понимаю тут никак не выкрутится без завершения всего кода node js.

    Код node может работать асинхронно, но на сколько я помню он не может асинхронно работать с BAS (запускать функции, изменять переменные при завершённом действии node js)



  • //функция для установки глобальной переменной типа string из ноды
    function PSet_string(name,value){
     let script = (`PSet(\"basglobal\", \"${name}\", JSON.stringify(\"${value}\"))`);
     BAS_API(script)
    }
    //use
     PSet_string('NAME','any string')
    


  • @dzxt said in BAS_API в Node js:

    //функция для установки глобальной переменной типа string из ноды
    function PSet_string(name,value){
     let script = (`PSet(\"basglobal\", \"${name}\", JSON.stringify(\"${value}\"))`);
     BAS_API(script)
    }
    //use
     PSet_string('NAME','any string')
    

    Это вы к чему?


Log in to reply