2013-06-03 35 views
14

Đây là mã nguồn cho delay chức năng Underscore.js':Tại sao Underscore.js có chức năng trì hoãn?

_.delay = function (func, wait) { 
    var args = slice.call(arguments, 2); 
    return setTimeout(function() { return func.apply(null, args); }, wait); 
}; 

thế nào là này bất kỳ khác nhau từ setTimeout? Tại sao Underscore.js cần delay?

Trả lời

21

Đó là một cách trình duyệt chéo có thể chuyển các đối số thừa sẽ xuất hiện dưới dạng đối số cho cuộc gọi lại, như setTimeout(). Điều này không hoạt động trong IE.

Nó có thể làm cho mã của bạn đẹp hơn ...

setTimeout(_.bind(function() { }, null, "arg1"), 1e3); 

... vs ...

_.delay(function() { }, 1e3, "arg1"); 

Tôi đồng ý rằng đó là một trong những phương pháp gạch ít hữu ích, được nêu trong Naomi's answer.

+1

Internet Explorer không hỗ trợ [đối số gọi lại] (https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout#Callback_arguments). Thật là một b ****! –

+0

@ Alex — nó không hỗ trợ truyền chuỗi ký tự như tham số đầu tiên, vì vậy không phải * mà * qua trình duyệt. Có lẽ đó là đề cập trong tài liệu ... – RobG

+0

@RobG Vâng, tôi không nghĩ rằng đó là một tính năng chúng tôi muốn giữ :) – alex

4

Không nhiều, mặc dù nó phù hợp theo chủ đề với defer, debounce, v.v. Điều này có nghĩa bạn có thể sử dụng gạch gói ký hiệu:

_(yourfunction).delay(1000); 

Ngoài ra nó không có vẻ như nó sẽ cho phép bạn nhận được ngay với một đối số chuỗi, mà sẽ gọi eval.

+2

Tôi không nghĩ rằng bất cứ ai trong tâm trí của họ sẽ vượt qua một chuỗi để 'setTimeout'. –

+0

@ plynx — không nhất thiết * eval *, thay vào đó, nó có thể sử dụng hàm tạo Hàm. ;-) @ Aadit — không khó để hỗ trợ chuỗi quá, chỉ cần kiểm tra đối số đầu tiên và nếu đó là một chuỗi, hãy sử dụng hàm tạo Hàm, sau đó gọi đặt thời gian chờ bằng. – RobG

+0

@AaditMShah robg Cả hai dường như hiểu lầm tôi - tôi đang nói đến lợi ích của việc không chấp nhận các đối số chuỗi. Tôi đã nhìn thấy nó xảy ra rất nhiều lần, và thậm chí đôi khi tình cờ. Bạn có thể tìm thấy nhiều ví dụ trong mã ở đây trên StackOverflow. Bàn tay của lập trình viên là những điều kỳ lạ và đôi khi họ đặt dấu ngoặc kép xung quanh mọi thứ khi bạn không tìm kiếm. – Plynx

11

Tại sao Underscore.js có chức năng trễ?

Vì câm. Phương thức underscore.js đặc biệt này có vẻ khá ngu ngốc.

Nhược điểm

  1. chức năng bổ sung trong lib nghĩa cơ sở mã lớn
  2. lớn mã cơ sở nghĩa hơn để duy trì và nhiều lỗi có thể
  3. mã có sử dụng chức năng này bây giờ có một sự phụ thuộc vào lib mà
  4. cải thiện ít hơn/nil so với API gốc có nghĩa là chi phí thấp: tỷ lệ đạt được
  5. apis mới để tìm hiểu

Ưu

phần này cố tình để trống


tôi sẽ chỉ học cách sử dụng javascript và làm điều gì đó như

var hello = function() { 
    console.log("hello"); 
}; 

var delay = 1000; 

window.setTimeout(hello, delay); 

Đơn giản, phải không? Underscore.js đôi khi khá vô dụng. Thành thật mà nói, window.setTimeout là hoàn toàn hữu ích chỉ là cách nó được.


Dưới đây là một ví dụ khác cho thấy làm thế nào để vượt qua một arg đến chức năng

var Cat = function(name) { 
    function meow(message) { 
    console.log(name, "says meow!", message); 
    } 
    this.meow = meow; 
}; 

var duchess = new Cat("Duchess"); 

window.setTimeout(duchess.meow.bind(duchess, "please feed me!"), 2000); 

// 2 seconds later 
// => Duchess says meow! please feed me! 

Nếu bạn không thể phụ thuộc vào .bind bạn có thể sử dụng một kết thúc quá

window.setTimeout(function() { 
    duchess.meow("please feed me!"); 
}, 1000); 

Wow, đó là khó khăn, mặc dù. Tôi sẽ trở lại để nhấn mạnh và lodash và jquery. Công cụ JavaScript này rất khó!

+5

Tôi hiểu cách tiếp cận của bạn, tuy nhiên khi bạn bắt đầu xuống đường của thư viện chung, bạn sẽ sớm thấy mình gói mọi thứ để không lộ ra API cơ bản (ví dụ: jQuery kết thúc mọi thứ dưới ánh mặt trời). Nếu không, người dùng bắt đầu bị nhầm lẫn về thư viện là gì và JS hoặc DOM gốc hoặc bất kỳ thứ gì bạn đang trừu tượng. Không hỗ trợ một cách tiếp cận khác, chỉ cần nói. – RobG

+3

Bunch of noobs vẫn đang bỏ phiếu này. Giữ họ đến, tân binh :) – naomik

+1

Tôi không hiểu tất cả sự căm ghét. Bạn không xứng đáng được giảm giá. –

9

aes · thét · ics

Tác giả của thư viện đó, những người đã chọn để chi tiêu/thời gian rảnh rỗi của mình để mở nguồn nó, nói về nó, sử dụng nó như là một cách để giới thiệu người để javascript và có lẽ được ai đó để có một khoảnh khắc bóng đèn xung quanh phạm vi đóng cửa nghĩ rằng sự hấp dẫn của thư viện đã được tăng cường bằng cách này.

Việc xác định mức độ liên quan của chức năng này trong sự cô lập cũng giống như tranh luận về mức độ liên quan của một bức tranh hoặc một phần khác của nghề thủ công. Một số có thể thích nó, những người khác có thể không.

Bạn có thể thoải mái thích nó hay không. Cá nhân tôi, thích các libs đơn giản hơn.

_.delay, _.defer, _.throttle, _.after có luồng IMHO đọc tốt hơn cửa sổ. Trên đầu trang của điều này, nói chung tôi cũng thích viết bên máy chủ nút (nodejs) và không phải chuyển/vào/ra khỏi chế độ ... thử sử dụng window.timeout trong nút và xem những gì sẽ xảy ra.

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