2013-11-02 13 views
79

có thể cho tôi một ví dụ đơn giản về callbacks của nodeJs, tôi đã tìm kiếm giống nhau trên nhiều trang web nhưng không thể hiểu nó đúng cách, Hãy cho tôi một ví dụ đơn giản.callback callback của nodeJs Ví dụ đơn giản

getDbFiles(store, function(files){ 
    getCdnFiles(store, function(files){ 
    }) 
}) 

tôi muốn làm một cái gì đó như thế ...

+0

một ví dụ về cách viết một hàm mà phải mất một callback như một cuộc tranh cãi? – Gntem

+0

yeah một cái gì đó như thế, bất kỳ ví dụ đơn giản mà giúp tôi hiểu nó. –

+0

Gọi lại là một hàm mà bạn chuyển làm tham số cho một chức năng khác ... Google pls -> "gọi lại javascript" -> kết quả đầu tiên –

Trả lời

151
var myCallback = function(data) { 
    console.log('got data: '+data); 
}; 

var usingItNow = function(callback) { 
    callback('get it?'); 
}; 

Bây giờ mở nút hoặc trình duyệt giao diện điều khiển và dán các định nghĩa ở trên.

Cuối cùng sử dụng nó với dòng tiếp theo này:

usingItNow(myCallback); 

Với Tôn trọng các Công ước Lỗi Node-Style

Costa hỏi điều gì sẽ trông giống như nếu chúng ta tôn vinh những callback lỗi nút công ước.

Trong quy ước này, cuộc gọi lại sẽ nhận được ít nhất một đối số, đối số đầu tiên, là lỗi. Tùy chọn, chúng tôi sẽ có một hoặc nhiều đối số bổ sung, tùy thuộc vào ngữ cảnh. Trong trường hợp này, ngữ cảnh là ví dụ trên.

Ở đây tôi viết lại ví dụ của chúng tôi trong quy ước này.

var myCallback = function(err, data) { 
    if (err) throw err; // Check for the error and throw if it exists. 
    console.log('got data: '+data); // Otherwise proceed as usual. 
}; 

var usingItNow = function(callback) { 
    callback(null, 'get it?'); // I dont want to throw an error, so I pass null for the error argument 
}; 

Nếu chúng ta muốn mô phỏng một trường hợp lỗi, chúng tôi có thể xác định usingItNow như thế này

var usingItNow = function(callback) { 
    var myError = new Error('My custom error!'); 
    callback(myError, 'get it?'); // I send my error as the first argument. 
}; 

Việc sử dụng cuối cùng được chính xác giống như ở trên:

usingItNow(myCallback); 

Sự khác biệt duy trong hành vi sẽ phụ thuộc vào phiên bản usingItNow bạn đã xác định: phiên bản cấp "giá trị trung thực" (đối tượng Lỗi) cho cuộc gọi lại cho đối số đầu tiên hoặc đối tượng cấp dữ liệu nó null cho đối số lỗi.

+0

Vì vậy, điều này trông như thế nào với lỗi như quy ước tham số đầu tiên? – Costa

+2

Tuyệt vời aswer! Chúc mừng! – lesimoes

+0

Câu trả lời tuyệt vời !! +1 –

9

Dưới đây là một ví dụ về tập tin văn bản sao chép với fs.readFilefs.writeFile:

var fs = require('fs'); 

var copyFile = function(source, destination, next) { 
    // we should read source file first 
    fs.readFile(source, function(err, data) { 
    if (err) return next(err); // error occurred 
    // now we can write data to destination file 
    fs.writeFile(destination, data, next); 
    }); 
}; 

Và đó là một ví dụ của việc sử dụng copyFile chức năng:

copyFile('foo.txt', 'bar.txt', function(err) { 
    if (err) { 
    // either fs.readFile or fs.writeFile returned an error 
    console.log(err.stack || err); 
    } else { 
    console.log('Success!'); 
    } 
}); 

Common Node.js mẫu gợi ý rằng đối số đầu tiên của hàm gọi lại là lỗi. Bạn nên sử dụng mô hình này vì tất cả các module kiểm soát dòng chảy dựa vào nó:

next(new Error('I cannot do it!')); // error 

next(null, results); // no error occurred, return result 
+1

tiếp theo là gì? Kết quả biến = cái gì được gọi? –

+3

@SemicolonWarrier là một con trỏ cho tôi cũng như những người khác: http://stackoverflow.com/questions/5384526/javascript-node-js-next – kmonsoor

87

chức năng Một callback chỉ đơn giản là một chức năng bạn vượt qua thành chức năng khác để chức năng có thể gọi nó là tại một thời điểm sau đó. Điều này thường thấy trong không đồng bộ API s; cuộc gọi API trả về ngay lập tức vì nó không đồng bộ, vì vậy bạn chuyển một hàm vào API mà API có thể gọi khi thực hiện xong nhiệm vụ không đồng bộ của nó.

Ví dụ đơn giản nhất mà tôi có thể nghĩ đến trong JavaScript là hàm setTimeout(). Đó là một hàm toàn cục chấp nhận hai đối số. Đối số đầu tiên là hàm gọi lại và đối số thứ hai là một sự chậm trễ tính bằng mili giây.Hàm được thiết kế để đợi khoảng thời gian thích hợp, sau đó gọi hàm gọi lại của bạn.

setTimeout(function() { 
    console.log("10 seconds later..."); 
}, 10000); 

Bạn có thể đã thấy mã ở trên trước đây nhưng không nhận ra chức năng bạn đang chuyển vào được gọi là chức năng gọi lại. Chúng tôi có thể viết lại đoạn mã trên để làm rõ hơn.

var callback = function() { 
    console.log("10 seconds later..."); 
}; 
setTimeout(callback, 10000); 

Gọi lại được sử dụng khắp nơi trong Nút vì Nút được xây dựng từ mặt đất đến không đồng bộ trong mọi thứ. Ngay cả khi nói chuyện với hệ thống tập tin. Đó là lý do tại sao một tấn Node API nội bộ chấp nhận các chức năng gọi lại như các đối số thay vì trả về dữ liệu mà bạn có thể gán cho một biến. Thay vào đó, nó sẽ gọi hàm gọi lại của bạn, truyền dữ liệu mà bạn muốn làm đối số. Ví dụ, bạn có thể sử dụng thư viện fs của Node để đọc một tệp. Mô-đun fs hiển thị hai hàm API duy nhất: readFilereadFileSync.

Chức năng readFile không đồng bộ trong khi readFileSync rõ ràng là không. Bạn có thể thấy rằng họ dự định bạn sử dụng các cuộc gọi không đồng bộ bất cứ khi nào có thể vì họ gọi họ là readFilereadFileSync thay vì readFilereadFileAsync. Đây là một ví dụ về việc sử dụng cả hai hàm.

Synchronous:

var data = fs.readFileSync('test.txt'); 
console.log(data); 

Đoạn mã trên thực hiện khối thread cho đến khi tất cả các nội dung của test.txt được đọc vào bộ nhớ và lưu trữ trong biến data. Trong nút này thường được coi là thực hành xấu. Đôi khi, khi nó hữu ích, chẳng hạn như khi viết một kịch bản nhỏ nhanh để làm một cái gì đó đơn giản nhưng tẻ nhạt và bạn không quan tâm nhiều về việc tiết kiệm từng giây nano của thời gian mà bạn có thể.

Asynchronous (với callback):

var callback = function (err, data) { 
    if (err) return console.error(err); 
    console.log(data); 
}; 
fs.readFile('test.txt', callback); 

Đầu tiên chúng ta tạo một hàm callback mà chấp nhận hai đối số errdata. Một vấn đề với các hàm không đồng bộ là nó trở nên khó khăn hơn trong việc bẫy các lỗi nên rất nhiều API kiểu gọi lại truyền các lỗi như là đối số đầu tiên cho hàm gọi lại. Cách tốt nhất là kiểm tra xem err có giá trị hay không trước khi bạn làm bất cứ điều gì khác. Nếu vậy, hãy ngừng thực hiện cuộc gọi lại và đăng nhập lỗi.

Cuộc gọi đồng bộ có lợi thế khi có trường hợp ngoại lệ được ném vì bạn có thể chỉ cần bắt chúng với khối try/catch.

try { 
    var data = fs.readFileSync('test.txt'); 
    console.log(data); 
} catch (err) { 
    console.error(err); 
} 

Trong các chức năng không đồng bộ, nó không hoạt động theo cách đó. Cuộc gọi API trả về ngay lập tức để không có gì bắt được với try/catch. Các API không đồng bộ thích hợp sử dụng các cuộc gọi lại sẽ luôn luôn bắt lỗi của riêng chúng và sau đó chuyển các lỗi đó vào trong hàm gọi lại nơi bạn có thể xử lý nó khi bạn thấy phù hợp.

Ngoài các cuộc gọi lại, có một kiểu API phổ biến khác thường được sử dụng được gọi là lời hứa. Nếu bạn muốn đọc về chúng thì bạn có thể đọc toàn bộ bài đăng trên blog mà tôi đã viết dựa trên câu trả lời này here.

+0

một cách phân phối khá phức tạp nhưng chưa chính xác của khái niệm; cho trình khởi động node.js như tôi ... – kmonsoor

2

Hãy thử ví dụ này đơn giản như bạn có thể đọc, chỉ cần sao chép lưu newfile.js làm nút newfile để chạy ứng dụng.

function myNew(next){ 
    console.log("Im the one who initates callback"); 
    next("nope", "success"); 
} 


myNew(function(err, res){ 
    console.log("I got back from callback",err, res); 
}); 
1

chúng ta đang tạo một chức năng đơn giản như

callBackFunction (data, function (err, response){ 
    console.log(response) 
}) 

// callbackfunction 
function callBackFuntion (data, callback){ 
    //write your logic and return your result as 
callback("",result) //if not error 
callback(error, "") //if error 
}