2012-10-06 36 views
21

Tôi có thể đếm khi ánh xạ nodeID được hoàn thành mỗi khi doSomething() được gọi?Node.js Array.map() có đồng bộ không?

nodeIDs = $.map(nodeIDs, function(n){ 
    return n.match(/\d+$/); 
}); 
doSomething(nodeIDs); 

Tôi nghĩ tất cả các cuộc gọi lại trong node.js đều không đồng bộ? Tôi đã đọc một bài viết về lập trình chung mà gọi lại có thể được đồng bộ nhưng tôi không chắc chắn về node.js?

+0

$ ở đây là gì? bản đồ có chức năng gọi lại để áp dụng cho từng thành viên của danh sách, chứ không phải gọi lại khi hoàn tất quá trình lặp lại. – chovy

+0

Cảm ơn chovy.Đối với $, tôi đã chỉ thử nghiệm với mô-đun nút-jquery và không bận tâm để chỉnh sửa điều đó. – bonchef

Trả lời

32

JavaScript cũng là ngôn ngữ lập trình hàm. Những gì bạn có ở đây là «hàm bậc cao», một hàm có chức năng như một tham số. Các hàm bậc cao hơn là đồng bộ (nhưng xem lưu ý bên dưới).

Nguồn:

map() là một ví dụ điển hình của một hàm bậc cao. Nó có một hàm và áp dụng nó cho tất cả các phần tử của một mảng. Định nghĩa âm thanh rất «chức năng». Chức năng này cũng không được cung cấp bởi Node. Tài liệu được ghi bởi MDN Array.prototype.map() và được chỉ định bởi ECMAScript 5.1.

Để trả lời câu hỏi của bạn: Có, doSomething(nodeIDs) được gọi là sau tất cả các yếu tố đã được áp dụng.


Lưu ý: Hàm bậc cao là khái niệm lập trình hàm. JavaScript có chức năng, nhưng cũng được đặt sâu trong tính thực tiễn của việc thực thi mã bên trong trình duyệt hoặc trên máy chủ. Tôi sẽ nói rằng ví dụ setTimeout() không phải là một hàm bậc cao hơn ngay cả khi nó có chức năng như một tham số vì setTimeout() không thực sự là chức năng thuần túy bởi vì nó sử dụng thời gian. Chức năng tinh khiết là vô tận. Ví dụ kết quả của map() không phụ thuộc vào thời gian. Và đó là những gì câu hỏi này thực sự là về. Nếu một cái gì đó không phụ thuộc vào thời gian bạn thực hiện nó đồng bộ. Đã giải quyết được sự cố.

Cảm ơn Simon đã thử thách định nghĩa hàm bậc cao hơn trong JavaScript.

+0

Cảm ơn nalply. Nhìn vào việc thực hiện tham chiếu của map() giúp. – bonchef

+0

* Chức năng bậc cao hơn là đồng bộ * - thực sự? setTimeout cũng là một hàm bậc cao hơn, nhưng nó không đồng bộ. –

+0

@ SimonA.Eugster Bạn có một điểm. Nếu bạn định nghĩa đúng các hàm có chức năng như các tham số như «thứ tự cao hơn» thì các hàm không đồng bộ cũng là «thứ tự cao hơn». Bạn sẽ gọi những hàm đồng bộ nào có chức năng như các tham số? – nalply

0

Chức năng này là đồng bộ - nếu không nó không thể trả về kết quả của thao tác bản đồ.

Bất kỳ callbacks mà có thể mất thời gian lâu hơn (chủ yếu là do IO) là không đồng bộ trong nodejs - trừ khi phương pháp này là explicitely đánh dấu là đồng bộ (như fs.readFileSync - nhưng điều đó không sử dụng một callback). Bạn có thể nhầm lẫn bằng cách nào đó.

+0

Cảm ơn ThiefMaster. Tôi hiểu phần của các phiên bản Đồng bộ hóa và Không đồng bộ của các hàm IO và đã sử dụng cả hai trong quá khứ. Để cụm từ lại câu hỏi của tôi tốt hơn: cho một đoạn mã, khi không có callbacks, tôi có thể giả định dòng chảy đồng bộ. Nhưng khi có callbacks, không có cách nào rõ ràng để xác nhận một chiều hay cách khác? Nếu các IO liên quan đến khả năng chúng không đồng bộ. Nhưng trong trường hợp map(), tôi không chắc lắm - không phải các nodej cũng như các tham chiếu Javascript dường như chỉ rõ điều đó. Vì vậy, làm thế nào tôi có thể nói cho các chức năng thư viện tiếp theo tôi gặp phải? – bonchef

+0

Tài liệu tuyên bố nó. Ví dụ. http://nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback "đổi tên không đồng bộ" – ThiefMaster

11

Có, .map là đồng bộ. "Gọi lại" không ngụ ý "không đồng bộ".

+1

Cảm ơn Charmander. Tôi có nghĩa là để nói 'khi nghi ngờ, giả sử gọi lại có thể được gọi là không đồng bộ tại một thời điểm khác nhau'. Vì vậy, câu hỏi thực sự là (xem ý kiến ​​của tôi ở trên) - Nói chung làm thế nào tôi có thể nói nếu một chức năng thư viện nhất định là không đồng bộ hay không? – bonchef

+0

Chức năng tệp node.js chẳng hạn được viết thành tài liệu, nhưng các hàm khác, chẳng hạn như ánh xạ mảng tôi dường như không tìm thấy thông tin cụ thể này. – bonchef

+0

Đó là bởi vì chúng không được cung cấp bởi Node. Chúng thuộc về thời gian chạy V8. V8 triển khai ECMAScript. 'Array.map()' được ghi lại ở đây: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map. – nalply

3

nhập module async để có một không đồng bộ 'map' phương pháp

var async = require('async'); 

var arr = ['1','2']; 
async.map(arr, getInfo, function (e, r) { 
    console.log(r); 
}); 

function getInfo(name, callback) { 
    setTimeout(function() { 
    callback(null, name + 'new'); 
    }, 1000); 
} 
Các vấn đề liên quan