|
Post by account_disabled on Apr 15, 2024 22:25:37 GMT -6
JavaScript 是一种异步执行代码的单线程语言。对于基本的编程结构来说,这没有任何区别,但是对于复杂的逻辑,异步代码执行会给代码带来额外的复杂性。如果您听说过末日金字塔,您就会知道我在说什么。 JavaScript Jabber 有一个关于异步编程结构和末日金字塔(维基百科)主题的精彩播客。末日金字塔的代码示例: 具体例子 我介绍了q库,它是实现 Promise 规范的众多库之一。在此页面上您可以找到 Promise/A+ 规范的所有实现。 q 库可以在服务器端(使用 Node.js)或客户端 瑞士 移动电话号码 与任何其他框架一起使用。在这里显示的示例中,我在服务器端、快速 Web 应用程序中使用了 q。源代码可以在jsexpense GitHub 存储库中找到。 q 库可以通过以下方式安装: npm install q then() 和fail() 的用法 在connectionManager.js文件中,我导入 q 库以及我需要使用的其他库。这是创造承诺所必需的。 var mysql = require('mysql'); var q = require('q'); var LOG_PREFIX = '[CONN] - '; function getConnection() { var deferred = q.defer(); var connection = mysql.createConnection({ … }); connection.connect(function (err) { if (err) { console.error(err); deferred.reject(err); } console.log(LOG_PREFIX + 'Connection created with id:' + connection.threadId); deferred.resolve(connection); }); return deferred.promise; } 在getConnection函数中,我创建了一个延迟对象,它包含一个接口,通过该接口我可以拒绝或履行承诺。然后,我创建并尝试使用 MySQL 连接的 connect 函数建立连接(如果您对此代码部分有疑问,请阅读我们的《从 Node.js 使用 MySQL》指南)。 connect方法需要一个回调方法,一旦连接成功创建,或者由于错误(如无法访问 MySQL 服务器)而未创建连接,就会调用该回调方法。 回调函数的err参数有助于决定连接。如果err参数没有真值,那么我将错误记录到控制台并调用延迟对象的拒绝方法。调用reject方法可确保框架执行promise的fail()方法中指定的函数(如上面的状态图所示)。 如果err对象具有假值,则我调用延迟对象的解析方法,并将连接对象作为参数传递给它。这将调用Promise 的then()方法,并将连接对象作为参数传递给 then 方法执行的函数。在getConnection()函数的末尾,我返回延迟对象的承诺。这使得在调用 getConnection 后可以使用failed()和then()方法,如下例所示:
|
|