callback问题

js编程遇到的最大问题就是单线程异步问题,这里面涉及最多的肯定就是callback了,不能处理好callback问题,常常会出现大量的嵌套情况,就是著名的callback hell了。

ES6中会引入一个新的规范,叫做Promise。这可以规范我们使用异步的情况。

releasing Zalgo

What it means is a function that accepts a callback and sometimes returns it right away, and some other times it returns it after some delay, in the future.

就是我们的代码之中的callback,可能sync,也可能async触发,比如:

  1. function register(options, callback) {
  2. var first_name = (options['first_name'] || '').trim();
  3. var last_name = (options['last_name'] || '').trim();
  4. var errors = [];
  5. if (!first_name) {
  6. errors.push(['first_name', 'Please enter a valid name']);
  7. }
  8. if (!last_name) {
  9. errors.push(['last_name', 'Please enter a valid name']);
  10. }
  11. if (errors.length) {
  12. return callback(null, errors);
  13. }
  14. var params = {
  15. 'user': {
  16. 'email': options['email'],
  17. 'first_name': first_name,
  18. 'last_name': last_name,
  19. 'new_password': options['new_password'],
  20. 'new_password_confirmation': options['new_password_confirmation'],
  21. 'terms': '1'
  22. },
  23. 'vrid': options['vrid'],
  24. 'merge_history': options['merge_history'] || 'true'
  25. };
  26. requestWithSignature('post', '/api/v2/users', params, callback);
  27. }

而最好的做法,是保证callback全是sync或者async, 那么将上面的修改为:

  1. if (errors.length) {
  2. process.nextTick(function() {
  3. callback(null, errors);
  4. });
  5. return;
  6. }

就可以避免releasing Zalgo

参考资料

原文: https://leohxj.gitbooks.io/front-end-database/content/javascript-advance/callback.html