NodeJS: не ждите возврата функции - PullRequest
0 голосов
/ 28 октября 2018

Я сейчас начинаю с NodeJS, и я хочу запускать одну и ту же функцию несколько раз одновременно с разными аргументами, но я не уверен, как это сделать.Из моего текущего опыта NodeJS / Javascript в целом не ждут, пока функция возвратит, но в моем случае это действительно смущает меня.Мой текущий код выглядит примерно так:

XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
start=function(values){
    max=5
    started=0
    finished=0
    maxReachedBefore=false
    finishedStarting=false
    result=[]

    interval = setInterval(function(){
        if(!finishedStarting){
            if((started-finished)>= max) {
                if(!maxReachedBefore){
                    console.log("Max Reached!")
                    maxReachedBefore=true
                }
                return;
            }
            maxReachedBefore=false
            getValue(values[started])
            console.log("Started getValue")
            started++
        } else {
            if (started<=finished){
                clearInterval(interval)
                console.log("Finished!")
            }
        }

    },10)
}

getValue=function(value){
    var request=new XMLHttpRequest()
    request.open("get","MY_WEBSITE_HERE.COM/"+value, false)
    request.send()
    result=result.concat(request.responseText)
    console.log("Finished getValue")
    finished++
}

start(["a","medium","sized","list","of","values","that","i","want","to","get","the","corresponding","values","to"])

Теперь я ожидаю, что это будет продолжать запускать getValue с разными значениями, пока не достигнут максимум -> getValue работает менее 6 раз, но это не так,getValue запускается один за другим, следующий начинается только после завершения последнего.Может кто-нибудь объяснить, почему это происходит / Помогите мне изменить это?

[Прошу прощения, я относительно новичок в NodeJS]

1 Ответ

0 голосов
/ 28 октября 2018

Вы отправляете синхронный запрос на сервер.Поэтому функция будет ожидать ответа от сервера.

request.open("get","MY_WEBSITE_HERE.COM/"+value, false)

Последний параметр boolean указывает, является ли вызов синхронизированным или асинхронным.

request.open("get","MY_WEBSITE_HERE.COM/"+value, true)

Это отправит асинхронный вызов, а в функцию обратного вызова добавит операторы консоли готового значения get.

var finished = 0;
var result=[];
 start=function(values){
 max=5
 started=0    
 maxReachedBefore=false
 finishedStarting=false

  interval = setInterval(function(){
    if(!finishedStarting){
        if((started-finished)>= max) {
            if(!maxReachedBefore){
                console.log("Max Reached!")
                maxReachedBefore=true; 
                finishedStarting = true;
            }
            return;
        }
        maxReachedBefore=false; 
        console.log("Started getValue " + values[started]);

        getValue(values[started]); 
        started++;

    } else {
        if (started<=finished){
            clearInterval(interval)
            console.log("Finished!")
        }
    }

  },10);
}

getValue=function(value){
    var request=new XMLHttpRequest()
    request.open("get","MY_WEBSITE_HERE.COM/"+value, true); 

    request.onreadystatechange = function () {
     if(request.readyState === 4 && request.status === 200) {
       result=result.concat(request.responseText);
       console.log("Finished getValue " + value)
       finished++;
     }
    };
   request.send();
   console.log("request sent");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...