2015-11-03 22 views
8

Giả sử tôi có trường nhập văn bản (giống như trường tìm kiếm của Google), khi được thay đổi, sẽ kích hoạt yêu cầu và hiển thị một số kết quả.AngularJS - Làm cách nào để hủy lời hứa?

Ví dụ,

Hãy gõ Dog trong đầu vào:

typed D -> Calls ctrl.search('D') -> Makes a request -> Changes model when success 
typed DO -> Calls ctrl.search('DO') -> Makes a request -> Changes model when success 
typed DOG -> Calls ctrl.search('DOG') -> Makes a request -> Changes model when success. 

Bây giờ, chúng ta hãy nói rằng yêu cầu DO phản ứng muộn hơn DOG một. Mô hình của tôi sẽ kết thúc với kết quả DO, ngay cả khi tôi đã nhập DOG.

Đối với điều đó, tôi cần một cách để hủy hoặc hủy các yêu cầu hiện tại đang diễn ra nếu tôi tiếp tục nhập các ký tự. Bằng cách đó, mô hình của tôi chỉ thay đổi theo yêu cầu cuối cùng.

đầu vào của tôi trông giống như sau:

<input type="text" class="form-control" data-ng-model="query" data-ng-change="ctrl.search(query)" placeholder="Search" /> 

Đây là tôi searchCtrl.js:

var search; 
var language; 
var _this; 

var SearchCtrl = function (searchService, lang) 
{ 
    search = searchService; 
    langauge = lang; 
    _this = this; 
} 

SearchCtrl.prototype.search = function (text) 
{ 
    var promise = search.language(language) 
        .facet('characters') 
        .highlight('quotes') 
        .query(text); 

    promise.then(function (response) { 
     if(!response) return; 
     _this.total = response.total; 
     _this.count = response.found; 
     _this.result = response.data; 
    }); 
} 
+0

Chúng tôi không thể hủy promise..either chúng ta cần cho 'reject' hoặc' resolve' nó để hoàn thành nó .. –

+1

1) Sử dụng debounce trong hộp văn bản của bạn, bạn có thể sử dụng tùy chọn ng-model-2) Bạn có thể cung cấp lời hứa cho thuộc tính timeout của tùy chọn http bạn có thể hủy bỏ nó (bằng cách từ chối đối tượng trì hoãn), nhưng yêu cầu sẽ vẫn được xử lý bởi máy chủ nó sẽ bị từ chối ở cấp độ máy khách. – PSL

+0

Có thể sẽ tốt hơn nếu bạn không giải quyết yêu cầu này ngay từ đầu cho đến khi tạm dừng trong quá trình gõ đã xảy ra. Việc hủy yêu cầu sẽ không ngăn máy chủ xử lý yêu cầu nếu nó đã nhận được yêu cầu đó. xem xét https://docs.angularjs.org/api/ng/directive/ngModelOptions tùy chọn gỡ lỗi cụ thể. –

Trả lời

4

Thông thường đối với trường hợp này, mọi người sử dụng ng-model-options={debounce: 100}.

https://docs.angularjs.org/api/ng/directive/ngModelOptions

bạn có thể từ chối lời hứa.

+0

Điều này đã làm các trick! Cảm ơn nhiều! Đây có phải là sự chậm trễ trước khi gửi mỗi yêu cầu không? –

+0

có, nó giúp bạn;) u're welcome. – Errorpro

+0

@MatiasCicero về cơ bản nó là một thời gian chờ được thiết lập lại mỗi khi giá trị thay đổi. vì vậy, nếu giá trị ngừng thay đổi cho 100ms, bộ hẹn giờ kết thúc và yêu cầu được gửi đi. –

0

Như thế này: $q.reject(response);

Mặc dù về mặt kỹ thuật Tôi tin rằng commenter trên là chính xác, bạn thực sự từ chối lời hứa và không thực sự hủy lời hứa.

+1

Điều đó sẽ không từ chối yêu cầu cuối cùng của tôi? Điều gì sẽ là logic để hủy bỏ chỉ một yêu cầu nếu người dùng vẫn đang gõ? –

+0

Tôi đã trả lời trước khi tôi hoàn toàn đặt mã ví dụ mã của bạn, câu trả lời debounce ở trên là một phương pháp tốt hơn để giải quyết nhu cầu của bạn. –

1

Tôi nghĩ bạn muốn sử dụng kỹ thuật debounce trong trường hợp này?

see:

+0

Cảm ơn bạn! 'Làm mờ': 0' làm gì? –

+0

Tôi đã sao chép từ tài liệu, có thể không cần thiết trong trường hợp của bạn, khi rời khỏi trường, nó sẽ không bị chậm trễ (vì nó là 0), bạn có thể tinh chỉnh việc xóa dựa trên từng loại sự kiện nếu muốn – house9

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