JavaScript の特性は非同期です。JavaScript は待機する必要があるものを実装する場合、そこで停止して結果が返されるのを待つことはできません。それどころか、コールバックを使用する必要があります。関数を定義すると、この関数は結果が利用可能になるまで待機することしかできません。結果が利用可能になったときにのみ呼び出すことができます。
このコールバック モデルは、適切なコード構成には問題ありませんが、元のコールバックから Promise に切り替えることで、多くの問題を解決できます。これにより、コード構成が簡素化されます。建築。
約束とは何ですか?
Promise は、「.then()」メソッドを備えたオブジェクトです。これは、誰がこのオブジェクトにアクセスしても、操作の結果がまだ取得できないか、または不明である可能性があることを表します。 " メソッド。操作が成功または失敗したときにリマインダー通知を待機するコールバックを追加します。
それでは、なぜこれがコールバックよりも優れているのでしょうか?標準のコールバック モードでは、リクエストを処理するときにコールバック関数が必要です:
request(url, function(error, response) { // handle success or error. }); doSomethingElse();
残念ながら、このコードはリクエスト関数がいつ完了するか分からないことを意味しており、もちろんその必要はなく、最終的にはコールバックを通じて結果を渡すことになります。これにより、複数のコールバックがネストされたコールバック、つまりコールバック トラップを形成します。
queryTheDatabase(query, function(error, result) { request(url, function(error, response) { doSomethingElse(response, function(error, result) { doAnotherThing(result, function(error, result) { request(anotherUrl, function(error, response) { ... }); }); }); }); });
Promise はこの問題を解決し、低レベルのコードでリクエストを作成し、未完了の操作を表すオブジェクトを返し、呼び出し元がどのコールバックを追加するかを決定できるようにします。
約束とは何ですか?
Promise は、値を返すか例外をスローするプロキシ オブジェクトです。一般に、Promise オブジェクトには then メソッドがあり、この then メソッドが戻り値 (結果の値) を取得します。 Promise の実装が成功した場合 (フルフィルメントと呼ばれます)、または例外 (Promise を拒否する理由、拒否と呼ばれます) をスローした場合は、onFulfilled と OnRejected を呼び出すことができる 2 つのオプションのコールバックをパラメータとして使用します。
var Promise = doSomethingAync()
promise.then(onFulfilled, onRejected)
したがって、Promise には次の 3 つの異なる状態があります:
■pending 保留中の Promise - Promise の初期状態
■履行された約束 - 約束は正常に履行されました
■拒否 - 約束が失敗した状態
readFile(function (err, data) { if (err) return console.error(err) console.log(data) })
var Promise = readFile()
promise.then(console.log, console.error)
約束を理解する
Promise は日常の直感とは異なる場合があります。それを理解するには、.then() は常に新しい Promise を返します。たとえば、次のコードのように、いくつかの重要な原則を覚えておく必要があります。var Promise = readFile()
varpromise2 =promise.then(readAnotherFile, console.error)
ここでのパラメータ readAnotherFile と console.error は、非同期操作が成功した後のアクション onFulfilled または失敗後のアクション OnRejected を表します。つまり、ファイルが正常に読み取られた後に readAnotherFile 関数が実行され、それ以外の場合はエラーになります。失敗時に印刷および記録されます。この実装は、可能な 2 つのうちの 1 つにすぎません。
var promise = readFile() var promise2 = promise.then(function (data) { return readAnotherFile() // 如果readFile成功,执行readAnotherFile }, function (err) { console.error(err) // 如果readFile不成功,记录,但是还是执行readAnotherFile return readAnotherFile() }) promise2.then(console.log, console.error) // readAnotherFile函数的执行结果then は Promise を返すため、Promise はシリアル チェーンによって消費され、コールバック地獄を回避できることを意味します。
Promise法则有两部分必须分离:
(1).then()总是返回一个新的promise,每次你调用它,它不管回调做什么,因为.then()在回调被调用之前已经给了你一个承诺promise,回调的行为只影响承诺promise的实施,如果回调返回一个值,那么promise将使用那个值,如果这个值是一个promise,返回这个promise实施后的值给这个值,如果回调抛出错误,promise将拒绝错误。
(2)被.then()返回的promise是一个新的promise,它不同于那些.then()被调用的promise,promise长长的链条有时会好些隐藏这个事实,不管如何,每次.then()调用都会产生一个新的promise,这里必须注意的是你真正需要考虑的是你最后调用.then()可能代表失败,那么如果你不捕获这种失败,那么容易导致你的错误exception消失。
一些人认为.then()串联链条调用很类似fluent风格,但是长长的promise链条会让人迷惑,最后切分为一个个有意义的函数:
function getTasks() { return $http.get('http://example.com/api/v1/tasks') .then(function(response) { return response.data; }); } function getMyTasks() { return getTasks() .then(function(tasks) { return filterTasks(tasks, { owner: user.username }); }); }
在这个例子中,两个函数各自获得一个promise,携带了一个回调函数。
有趣的Promise
同样的promise能够接受任何数目的回调,当一个Promise被解决实施后,其中所有回调函数都会被调用,此外,一个promise在被解决实施后,甚至可以接受一个新的回调,这些回调完成能以正常方式被调用,这就允许我们使用回调实现简单形式的缓存:
var tasksPromise; function getTasks() { taskPromise = taskPromise || getTasksFromTheServer(); return taskPromise; }
这个案例中,getTasks()函数可以被任意次数调用,它总是返回铜牙的promise,其中函数getTasksFromTheServer()却只是被调用一次。
以上这篇NodeJS的Promise的用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

node、nvm与npm的区别:1、nodejs是项目开发时所需要的代码库,nvm是nodejs版本管理工具,npm是nodejs包管理工具;2、nodejs能够使得javascript能够脱离浏览器运行,nvm能够管理nodejs和npm的版本,npm能够管理nodejs的第三方插件。

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

node导出模块的两种方式:1、利用exports,该方法可以通过添加属性的方式导出,并且可以导出多个成员;2、利用“module.exports”,该方法可以直接通过为“module.exports”赋值的方式导出模块,只能导出单个成员。

安装node时会自动安装npm;npm是nodejs平台默认的包管理工具,新版本的nodejs已经集成了npm,所以npm会随同nodejs一起安装,安装完成后可以利用“npm -v”命令查看是否安装成功。

node中没有包含dom和bom;bom是指浏览器对象模型,bom是指文档对象模型,而node中采用ecmascript进行编码,并且没有浏览器也没有文档,是JavaScript运行在后端的环境平台,因此node中没有包含dom和bom。

本篇文章带大家聊聊Node.js中的path模块,介绍一下path的常见使用场景、执行机制,以及常用工具函数,希望对大家有所帮助!


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

ドリームウィーバー CS6
ビジュアル Web 開発ツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

WebStorm Mac版
便利なJavaScript開発ツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ホットトピック



