2014-01-22 5 views
0

как сделать ниже код синхронно в node.jsсделать запрос Синхронный в node.js

var abc; 
request(url,function (error, response, html) { //where url is website url 
     abc = html; 
} 
console.log(abc); 
console.log("some text"); 

Я хочу, что первая консоль в журнал HTML, который получает HTML из URL. переменная abc не должна быть неопределенной. Я должен выполнить приведенный выше код в цикле for. Если цикл отсутствует, я могу обрабатывать вышеуказанный код синхронно с помощью шагового модуля в node.js.

+1

Салман абсолютно прав, кажется, что вы новичок в асинхронном программировании, довольно сложно окунуться в традиционный способ синхронного программирования. Тем не менее, есть библиотеки, чтобы сделать процесс немного проще, асинхронный - один https://github.com/caolan/async, но вам все равно нужно думать, как асинхронно писать код. – user658991

+0

Возможный дубликат [Как я могу сделать этот вызов для запроса в nodejs синхронным?] (Http://stackoverflow.com/questions/9884418/how-can-i-make-this-call-to-request-in-nodejs -синхронный) – anvarik

+0

В качестве альтернативы, чтобы увидеть, нравится ли вам NodeJS, вы можете использовать язык, который компилируется в JavaScript. Примером может служить IcedCoffeeScript, язык сценария кофе, который поддерживает ожидание/отсрочку. –

ответ

1

Это не то, что node.js для, если вы используете node.js, тогда вы должны следовать шаблону асинхронного программирования. Если у вас нет веских причин.

Эти ссылки могут помочь вам понять концепции асинхронной модели программирования:

http://lostechies.com/johnteague/2012/11/30/node-js-must-know-concepts-asynchrounous/ http://stevehanov.ca/blog/index.php?id=127

Во-первых, вы должны поместить эту консоль внутри обратного вызова, если вы хотите, чтобы выполнить после запроса.

Во-вторых, вы никогда не должны помещать асинхронный код внутри цикла for, вместо этого используйте рекурсивную функцию, как показано ниже.

function fn() { 
    request(url,function (error, response, html) { //where url is website url 
     console.log(html); 

     // here 
     console.log("some text"); 
     if (condition) { 
      fn(); 
     } else { 
      // done 
      done(); 
     } 
    }); 
} 

function done() { 
    console.log('abc'); 
} 

Держа его в цикл будет создавать беспорядок с областью, поскольку полный цикл будет выполнен до появления даже первый обратного вызова.

+0

ok Я могу использовать эту функцию, но что, если я хочу написать код (скажем, хочу написать console.log («abc») под этим вызовом функции, чтобы консоль в рекурсивной функции записывала до того, как консоль, которую я написал после рекурсивной функции код вызова: fn(); console.write («abc»); эта консоль должна регистрироваться после консоли в функции fn() – jasmin9891

+0

Значение! Вы хотите написать «console.log» ниже (после) вызова функции и хочу, чтобы он выполнялся до 'console.log (html);'? Что именно вы хотите! Почему вы хотите усложнить свою жизнь, написав код в неправильной последовательности и ожидаете, что он будет выполнен правильно? –

+0

если я назову эту рекурсивную функцию fn(); & then, если я напишу console.log («abc»), этот abc будет занесен в журнал до console.log (html), который находится в рекурсивной функции. Я не хочу этого. – jasmin9891

0

Короткий ответ: не поддерживается.

Но вы можете сделать это с помощью fibers. Fibers - это библиотека, которая написана на C++, чтобы разрешить материал, который вы не можете получить на уровне node.js.

Чтобы добавить немного сахара к волокнам (хотя вы можете сделать свою собственную реализацию), вы можете использовать node-sync:

function asyncFunction(a, b, callback) { 
     setTimeout(function(){ 
      callback(null, a + b); 
     }, 1000) 
    } 


    var result = asyncFunction.sync(null, 2, 3); 
    console.log(result); // 5 (after 1 sec) 

Но если вам не нравится способ записи в Node.js я предлагаю вам используйте co или библиотеку, которая реализует обещания. Используя волокна (и force node.js для синхронности), чтобы украсить код, это плохая и плохая идея.

Смежные вопросы