検索
ホームページウェブフロントエンドjsチュートリアルES6 新機能: 遅延オブジェクト Promise 組み込み JavaScript コードの詳細

Promise の基本的な使い方:

Promise を使用すると、JS の非同期実行中にコールバック関数がネストするコールバック関数の問題を解決し、new を通じて関数実行プロセスをより簡潔に制御します。この関数には 2 つのパラメータが必要です。最初のパラメータは、関数の実行が成功した後に実行される関数 replace で、2 番目の関数は関数の実行が失敗した後に実行される関数です。コールバック関数を線形的に使用します。この関数には 4 つの層のコールバックがあります。

new Promise(function(resolve , reject) {
});

失敗したコールバックもカウントされると、さらに面倒になります。 Promise メソッドを使用する場合は、より読み取り習慣に沿った線形コードに変更できます。

fn("args", function(a) {
    fn1("foo", function(b) {
        fn2("bar", function(c) {
            fn3("baz", function(d) {
                alert("回调成功,获知的内容为:"+a+b+c+d)
            })
        })
    })
})

これは、ajax によるデータの非同期取得の例です。 コールバック関数

を使用しました。

new Promise(function(resolve , reject) {
    resolve(1);
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve , reject) {
        resolve(2);
    });
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve , reject) {
        resolve(3);
    });
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve , reject) {
        resolve(4);
    });
}).then(function(val) {
    console.log(val);
});

ES6 には Promise が組み込まれているため、上記のコールバックを Promise メソッドに書き換えることができます。まず、ajax 関数は Promise オブジェクトの

<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<script>
    var callback = function(res) {
        console.log(res);
    };
    var ajax = function(url, callback) {
        var r = new XMLHttpRequest();
        r.open("GET", url, true);
        r.onreadystatechange = function () {
            if (r.readyState != 4 || r.status != 200) return;
            var data = JSON.parse(r.responseText);
            callback(data);
        };
        r.send();
    };
    //执行请求:
    ajax("http://www.filltext.com?rows=10&f={firstName}", callback);
    //再做别的事情;
</script>
</body>
</html>

の 3 つの状態を返します。インスタンス化された各 Promise には、保留中 (待機中)、拒否済み (拒否済み)、解決済み (解決済み) の 3 つの状態があり、resolve() が実行されると、この Promise のステータスは Resolve になります。この場合、この Promise のステータスは拒否され、これらの状態は取り消し不能になります。

then メソッド: promise には 2 つのパラメーターが含まれます。 1 つは関数の成功コールバックです。2 つ目は関数の失敗コールバックです。

<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <script>
        var callback = function(res) {
            console.log(res);
        };
        var ajax = function(url) {
            return new Promise(function(resolve, reject) {
                var r = new XMLHttpRequest();
                r.open("GET", url, true);
                r.onreadystatechange = function () {
                    if (r.readyState != 4 || r.status != 200) return;
                    var data = JSON.parse(r.responseText);
                    resolve(data);
                };
                r.send();
            })
        };
        //执行请求:
        ajax("http://www.filltext.com?rows=10&f={firstName}").then(function(data) {
            callback(data);
        });
        //再做别的事情;
    </script>
</body>
</html>
var promise = new Promise(function(resolve , reject) {
    resolve(); //执行成功回调;
});
console.log(0);
promise.then(function(val) {
    console.log(1); 
}, function() {
    console.log("失败");
});
console.log("2");

Then メソッドは毎回異なる Promise インスタンスを返します。この成功コールバックのパラメータです。前の Promise インスタンスは、resolve メソッドを実行しました。 パラメータ; 一般に、then メソッドは、新しい Promise インスタンスが返された場合、新しい Promise インスタンスを返します。この機能を使用すると、

多層コールバック

var promise = new Promise(function(resolve , reject) {
    reject();
});
console.log(0);
promise.then(function(val) {
    console.log(1);
}, function() {
    console.log("失败");
});
console.log("2");

コードが非同期か同期かに関係なく、Promiseのthenメソッドを使用できます。同期コードはthenメソッドの最初のパラメータに直接記述されます。必要なパラメータは、resolve を通じて次の then メソッドに渡されます。

非同期コードの場合は、Promise インスタンスを直接返します。

new Promise(function(resolve , reject) {
    resolve(1);
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve , reject) {
        resolve(2);
    });
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve , reject) {
        resolve(3);
    });
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve , reject) {
        resolve(4);
    });
}).then(function(val) {
    console.log(val);
});

catch メソッド:

catch メソッドは、失敗したコールバックと同じです。前の非同期関数

がエラーをスローすると、そのエラーはキャッチされ、

new Promise(function(resolve , reject) {
    resolve(1);
}).then(function(val) {
    console.log(val);
    return 2;
}).then(function(val) {
    console.log(val);
    return 3;
}).then(function(val) {
    console.log(val);
    return new Promise(function(resolve,reject) {
        //异步操作些这里
        resolve(4);
    });
}).then(function(val) {
    console.log(val);
    return 5;
}).then(function(val) {
    console.log(val);
});

Promiseのエラーはレイヤーごとに渡されます。エラーがキャッチされなかった場合は、次の関数に渡されます。キャッチされるまでプロミスオブジェクトを呼び出して、その後続行します。 Promise.all(iterable) iterable パラメーター内のすべての Promise が解決されると、Promise も解決されます

all メソッドは

Promise 関数

のメソッドであることに注意してください。パラメータは配列であり、配列にはすべてが含まれます。これは

Promise

のインスタンスです:

var promise = new Promise(function(resolve , reject) {
    resolve(); //执行成功回调;
});
console.log(0);
promise.then(function(val) {
    console.log("成功");
    throw new Error("heheda");
}).catch(function(e) {
    console.log(e);
}).then(function() {
    console.log("继续执行");
});

Promise.race(iterable)

iterable パラメータ内の子 Promise が成功または失敗すると、親 Promise は、子 Promise の成功の戻り値または失敗の詳細を直ちに使用して、親 Promise バインディングの対応するハンドルをパラメーターとして呼び出し、Promise オブジェクトを返します。

Promise.reject(reason)

Promiseの拒否されたハンドルを呼び出し、このPromiseオブジェクトを返します。


Promise.resolve(value)

Promise オブジェクトを成功値 value で解決します。値が thenable である場合 (つまり、then メソッドを使用している場合)、返される Promise オブジェクトは値を「追跡」し、値の最終状態を採用します。それ以外の場合、戻り値は返された値を満たす (fullfil) ためにこの値を使用します。約束のオブジェクト。

公式の例:

new Promise(function(resolve , reject) {
    resolve(1);
}).then(function(val) {
        console.log(val);
        return new Promise(function(resolve , reject) {
            throw new Error("err");
        });
    }).then(function(val) {
        console.log(val);
        return new Promise(function(resolve , reject) {
            resolve(3);
        });
    }).then(function(val) {
        console.log(val);
        return new Promise(function(resolve , reject) {
            resolve(4);
        });
    }).then(function(val) {
        console.log(val);
    }).catch(function(err) {
        console.log(err);
    }).then(function() {
        console.log("继续执行")
    })
Promise ができたので、カプセル化された XMLHttpRequest を GET メソッドにカプセル化できます。これは使用すると便利です:

var p0 = new Promise(function(resolve) {
    setTimeout(function() {
        resolve(0)
    },1000);
})
var p1 = new Promise(function(resolve) {
    setTimeout(function() {
        resolve(1)
    },2000);
})
var p2 = new Promise(function(resolve) {
    setTimeout(function() {
        resolve(2)
    },3000);
})
Promise.all([p0,p1,p2]).then(function(arr) {
    console.log(arr)
})

次に使用します:

<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<p id="log"></p>
<script>
    &#39;use strict&#39;;
    var promiseCount = 0;
    function testPromise() {
        var thisPromiseCount = ++promiseCount;

        var log = document.getElementById(&#39;log&#39;);
        log.insertAdjacentHTML(&#39;beforeend&#39;, thisPromiseCount + &#39;) 开始(同步代码开始)<br/>&#39;);

        // 我们创建一个新的promise: 然后用&#39;result&#39;字符串解决这个promise (3秒后)
        var p1 = new Promise(function (resolve, reject) {
            // 解决函数带着解决(resolve)或拒绝(reject)promise的能力被执行
            log.insertAdjacentHTML(&#39;beforeend&#39;, thisPromiseCount + &#39;) Promise开始(异步代码开始)<br/>&#39;);

            // 这只是个创建异步解决的示例
            window.setTimeout(function () {
                // 我们满足(fullfil)了这个promise!
                resolve(thisPromiseCount)
            }, Math.random() * 2000 + 1000);
        });

        // 定义当promise被满足时应做什么
        p1.then(function (val) {
            // 输出一段信息和一个值
            log.insertAdjacentHTML(&#39;beforeend&#39;, val + &#39;) Promise被满足了(异步代码结束)<br/>&#39;);
        });

        log.insertAdjacentHTML(&#39;beforeend&#39;, thisPromiseCount + &#39;) 建立了Promise(同步代码结束)<br/><br/>&#39;);
    }
    testPromise();
</script>
</body>
</html>

偽のデータのアドレスは次のとおりです。自分で設定できます。コンソールリクエストを渡すことができます。クロスドメインの問題に注意してください。

画像を非同期でロードするために XMLHttpRequest を Promise にカプセル化するケース: http://www.php.cn/


その他:

上記は Promise の基本的な知識の一部であり、その他の知識ポイントもいくつかありますが、機能が限られているため、1 つずつ紹介することはできません (Promise.resolve のさまざまなパラメーター、Generator での使用、Promise の追加メソッドなど)。 );

Promise の実行プロセスを描いてください。Promise の理解が深まります。Promise はまだ少しわかりにくいです


ブラウザのサポート:

Chrome 32、Opera 1、Firefox 29、Safari 8、Microsoft Edge、これらのブラウザはすべてデフォルトでサポートされています

上記は ES6 の新機能、つまり組み込み遅延オブジェクト Promise コードの詳細です。 JavaScript など 関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) にご注意ください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
es6怎么判断是否为数组es6怎么判断是否为数组Apr 25, 2022 pm 06:43 PM

在es6中,可以利用“Array.isArray()”方法判断对象是否为数组,若判断的对象是数组,返回的结果是true,若判断对象不是数组,返回的结果是false,语法为“Array.isArray(需要检测的js对象)”。

es6中遍历跟迭代的区别是什么es6中遍历跟迭代的区别是什么Apr 26, 2022 pm 02:57 PM

es6中遍历跟迭代的区别是:遍历强调的是要把整个数据依次全部取出来,是访问数据结构的所有元素;而迭代虽然也是依次取出数据,但是并不保证取多少,也不保证把所有的数据取完,是遍历的一种形式。

es6中怎么判断两个对象是否相等es6中怎么判断两个对象是否相等Apr 19, 2022 pm 03:34 PM

在es6中,可用Object对象的is()方法来判断两个对象是否相等,该方法检测两个变量的值是否为同一个值,判断两个对象的引用地址是否一致,语法“Object.is(对象1,对象2)”;该方法会返回布尔值,若返回true则表示两个对象相等。

es6怎么将数字转为字符串es6怎么将数字转为字符串Apr 19, 2022 pm 06:38 PM

转换方法:1、利用“+”给数字拼接一个空字符,语法“数字+""”;2、使用String(),可把对象的值转换为字符串,语法“String(数字对象)”;3、用toString(),可返回数字的字符串表示,语法“数字.toString()”。

sort排序是es6中的吗sort排序是es6中的吗Apr 25, 2022 pm 03:30 PM

sort排序是es6中的;sort排序是es6中用于对数组的元素进行排序的方法,该方法默认不传参,按照字符编码顺序进行排序,排序顺序可以是字母或数字,并按升序或降序,语法为“array.sort(callback(a,b))”。

es6中assign的用法是什么es6中assign的用法是什么May 05, 2022 pm 02:25 PM

在es6中,assign用于对象的合并,可以将源对象的所有可枚举属性复制到目标对象;若目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性,语法为“Object.assign(...)”

es6怎么改变数组数据es6怎么改变数组数据Apr 26, 2022 am 10:08 AM

改变方法:1、利用splice()方法修改,该方法可以直接修改原数组的内容,语法为“数组.splice(开始位置,修改个数,修改后的值)”;2、利用下标访问数组元素,并重新赋值来修改数组数据,语法为“数组[下标值]=修改后的值;”。

import as在es6中的用法是什么import as在es6中的用法是什么Apr 25, 2022 pm 05:19 PM

在es6中,import as用于将若干export导出的内容组合成一个对象返回;ES6的模块化分为导出与导入两个模块,该方法能够将所有的导出内容包裹到指定对象中,语法为“import * as 对象 from ...”。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)