2013-07-09 22 views
5

https://github.com/danwrong/restler http://nodejs.org/javascript restler làm thế nào để chặn/chờ đợi vào một yêu cầu

để tải về một tập tin, tôi đang sử dụng restler từ nodejs trong một kịch bản phía máy chủ (không phải từ một trình duyệt web của khách hàng).

tôi có thể sử dụng cách async để bắn một sự kiện khi tải về hoàn tất, như sau:

rest = require('./restler'); 
rest.get('http://google.com').on('complete', function(result) { 
    if (result instanceof Error) { 
    sys.puts('Error: ' + result.message); 
    this.retry(5000); // try again after 5 sec 
    } else { 
    sys.puts(result); 
    } 
}); 

nhưng tôi thích sử dụng một cách đồng bộ hóa thời gian này.

làm cách nào tôi có thể gọi và chặn/đợi cho đến khi nhận được phản hồi?

và làm thế nào để có được các dữ liệu hoặc lỗi sau

var req = rest.get('http://twaud.io/api/v1/users/danwrong.json'); 
// how to block/wait here until file is downloaded 
if (req.response instanceof Error) { // this does not worn neither 
    ... 
} else { 
    ... 
} 
+0

Có lý do chính đáng để có phương pháp không đồng bộ và bạn sẽ chặn toàn bộ quá trình sẽ liên quan đến việc không sử dụng các yêu cầu/phản hồi khác. Luôn luôn có một cách để đi xung quanh nó và có sử dụng các phương pháp async thực tế. Xin bạn có thể mô tả lý do bạn muốn có một tình huống ngăn chặn, và có thể có một giải pháp tốt cho bạn để ở lại không đồng bộ với đáp ứng nhu cầu hợp lý của những thách thức của bạn. – moka

+0

nó không phải là một kịch bản trong một trình duyệt của khách hàng. nó là một kịch bản đơn giản trong một máy chủ, chạy và kết thúc khi tải xuống đã sẵn sàng. tôi không cần bất kỳ async ở đây. –

+0

Nó sẽ tải xuống và kích hoạt "hoàn thành" với đồng bộ hóa hoặc không đồng bộ, nó không có liên quan sau đó. Vì vậy, câu hỏi "tại sao bạn sẽ làm đồng bộ", nếu async là kết quả tương tự? Dù sao. 'restler' không có phương thức' sync' hoặc các phương thức cho phương thức. Bạn có thể tự thực hiện nó. – moka

Trả lời

1

Tôi nghĩ rằng bạn đang tìm kiếm một thư viện như Step, mà sẽ làm cho restler xuất hiện đồng bộ.

Bạn cung cấp cho nó một loạt các chức năng để bạn có thể viết mã theo kiểu tuyến tính hơn.

var rest = require('restler'); 
var Step = require('step'); 
var sys = require('sys'); 

function retry(millis) { 
    console.log('Queing another try'); 
    setTimeout(download, millis); 
} 

function download() { 
    Step(function() { 
      // 1 
      console.log('Starting download'); 
      rest.get('http://google.com').on('complete', this); 
     }, 
     function(result) { 
      // 2 
      console.log('Download complete'); 
      if (result instanceof Error) { 
       sys.puts('Error: ' + result.message); 
       retry(5000); // try again after 5 sec 
      } else { 
       sys.puts(result); 
      } 
      return result; 
     }, 
     function(result) { 
      // 3 
      console.log("This won't run until after Download is complete"); 
     }); 
} 
download(); 
+0

và câu trả lời này tới: http://stackoverflow.com/a/17689177/280393 –

Các vấn đề liên quan