2013-02-20 33 views
5

Tôi đã viết mã như thế này, và nó hoạt động tốt.Một số lo ngại về các chức năng trong underscore.js là không đồng bộ hoặc đồng bộ

var result = _.filter(array, function(item){return item[key] === k;}); 
... // logic using the variable result 

nhưng hôm nay tôi đột nhiên nhận ra về mặt kỹ thuật điều này có thể sai vì bộ lọc có thể chạy không đồng bộ và kết quả không thể có sẵn trong mã bên dưới dòng bộ lọc.

Chức năng bộ lọc có được triển khai theo cách đồng bộ không? Hay tôi phải ghi nhớ rằng chức năng lọc chạy không đồng bộ?

Cảm ơn trước!

Trả lời

11

Bạn có thể có một cái nhìn tại source code[github]:

// Return all the elements that pass a truth test. 
// Delegates to **ECMAScript 5**'s native `filter` if available. 
// Aliased as `select`. 
_.filter = _.select = function(obj, iterator, context) { 
    var results = []; 
    if (obj == null) return results; 
    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); 
    each(obj, function(value, index, list) { 
    if (iterator.call(context, value, index, list)) results[results.length] = value; 
    }); 
    return results; 
}; 

câu chuyện dài ngắn:_.filter là đồng bộ và hy vọng chức năng gọi lại để được đồng bộ cũng như (if (iterator.call(context, value, index, list))).

Thậm chí nhiều hơn như vậy, hàm này cũng đại diện cho hàm gốc .filter[MDN], cũng đồng bộ hóa.


Không phải mọi chức năng chấp nhận gọi lại đều không đồng bộ!

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