构buildJavascript的最佳方法如果语句在函数中是同步的

我问这个问题,所以我可以学习在JavaScript中做某些事情的“最佳做法”。 说我在这里有这个代码:

var someFunc = function () { if (something) { // do something } if (somethingElse) { // do somethingElse } }; 

问题是确保“某事”总是在“某事”之前运行的最佳方式是什么。 由于JavaScript是asynchronous的,我知道我需要某种callback系统来确保这一点。 但是,有没有更简单的方法来重构呢? 如果有很多if语句呢? 什么是最好的图书馆做这样干净的事情? 提前致谢。

并非所有的代码行都是在Javascript中asynchronous运行的。 这取决于你的代码。 例如:

 var someFunc = function () { if (something) { console.log('something'); } if (somethingElse) { console.log('something else'); } }; 

将始终写入以下输出:

 something something else 

但是,如果不是打印值,而是调用稍后运行的函数(如Ajax请求或setTimeoutcallback函数),则不能保证您的代码按照正确的顺序运行。 这种行为取决于你正在调用的函数。 例如,JQuery $.get()函数是asynchronous的(这意味着它会在稍后调用你的函数,而不是你的控件),像这样:

 var someFunc = function () { if (something) { $.get('some-file.txt').done(function (result) { console.log(result); }); } if (somethingElse) { $.get('some-other-file.txt').done(function (result) { console.log(result); }); } }; 

结果输出可以是其他任何内容中的“some-file.txt”和“some-other-file.txt”。

作为一个经验法则,当你将一个函数传递给另一个函数(callback函数)时,你可能正在使用Javascript的asynchronous特性。


嵌套的callback

解决此问题的一种方法是在第一个函数中调用第二个asynchronous调用:

 var someFunc = function () { if (something) { $.get('some-file.txt').done(function (result1) { console.log(result1); if (somethingElse) { $.get('some-other-file.txt').done(function (result2) { console.log(result2); }); } }); } }; 

但正如你可能已经猜到这个代码将很难阅读。


承诺救援

有了承诺,你可以有一个更容易阅读的代码。

让我们用promise来写上面的丑陋代码:

 var someFunc = function () { if (something) { $.get('some-file.txt').then(function (result1) { console.log(result1); if (somethingElse) { return $.get('some-other-file.txt'); } }).then(function (result2) { console.log(result2); }); }; 

一般而言,promise使代码更具可读性,并避免嵌套的callback。 你可以承诺,它会像同步代码读取,但它实际上是asynchronous运行。

看到这些问题获取更多信息:

  • 如何使用jQuery承诺链接三个asynchronous调用?
  • JQuery链的承诺

有什么承诺的承诺?

  1. 旧版浏览器不支持它们(但是可以使用ES6 Promise Polyfill等第三方库进行添加。
  2. 在承诺正式标准化之前,每个图书馆都有自己的实现,这些实现有些不兼容( jQuery , Angular , Ember )
  3. 他们是一个新的学习概念,所以新手的学习曲线会有点陡峭。

Javascript不是asynchronous的。

如果条件都满足,那么第一个内部是什么,如果先执行,然后第二个内容是执行。