2016-11-22 2 views
0

Довольно простой Node.js (консоль приложения) код Q не работает:Цепные Обещания Node.js с помощью

var request = require("request"); 
var q = require("q"); 
var data = new Object(); 
var deferred = new q.defer(); 

var url1 = "https://www.google.com" 
var url2 = "https://www.yahoo.com" 
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 

console.log('begin data1'); 
requestData(url1) //Promises seem to be working fine here 
    .then(function() { console.log('finished data1'); }) //At this point, we go back to async, and everything from here down executes at the same time. 
    .then(function() { console.log('begin data2'); }) 
    .then(function() { requestData(url2); }) //Expected behavior is that it should pause here, and execute everything below after the request is complete. 
    .then(function() { console.log('finished data2'); }) 
    .then(function() { console.log(data); }) 
    .then(function() { console.log('finished write2'); }) 
    .then(function() { console.log('operation completed!'); }); 

function requestData(url) { 
    console.log(url); 
    data = new Object(); 
    console.log(data); 
    deferred = new q.defer(); 
    console.log(deferred); 
    request({ 
     url: url, 
     json: true 
    }, function (error, response, obj) { 
     if (!error && response.statusCode === 200) { 
      data = obj; 
      deferred.resolve(); 
      console.log(deferred); 
     } else { 
      console.log('err'); 
     } 
    }); 
    return deferred.promise; 
} 

Проблема после первого .then заявления, все выполняется асинхронно. Я хочу, чтобы во второй раз я запускал вызов «requestData» как синхронный, как первый.

Простите мои консольные журналы для целей отладки.

Что я здесь делаю неправильно?

ответ

2

Проблема в том, что вы не возвращаете обещание в методах then.

Попробуйте это:

...something.then(function() { 
     return requestData(url2); 
}).then(function() { //called after requestData ended}); 
+1

Да, это был он. Просто. Благодаря! – Jordan

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