ホームページ WeChat アプレット WeChatの開発 WeChat 開発での async/await の使用

WeChat 開発での async/await の使用

Jun 06, 2020 pm 05:36 PM
WeChat アプレット

WeChat ミニ プログラムには、wx.login()、wx.request()、wx.getUserInfo() などの非同期呼び出しであるインターフェイスが多数あり、これらはすべてパラメーターとしてオブジェクトを使用します。そして、非同期呼び出しのさまざまな状況でコールバックとして機能する success()、fail()、および complete() を定義します。

しかし、コールバックの形式でプログラムを書くのは本当に面倒です。これらのことを順番に実行する必要があるプロセスがある場合:

  • wx.getStorage( ) キャッシュデータの取得、ログインステータスの確認

  • wx.getSetting() 設定情報の取得、

  • wx.login() 設定情報の使用ログイン

  • wx.getUserInfo() ログイン後のユーザー情報の取得

  • #wx.request() ビジネスへのデータリクエストの開始サーバー

  • #すると、コードはおそらく次のようになります
#
wx.getStorage({
    fail: () => {
        wx.getSetting({
            success: settings => {
                wx.login({
                    success: ({ code }) => {
                        wx.getUesrInfo({
                            code,
                            success: (userInfo) => {
                                wx.request({
                                    success: () => {
                                        // do something
                                    }
                                });
                            }
                        });
                    }
                });
            }
        });
    }
});
ログイン後にコピー
##明らかに、async/await を使用すると、同じロジックのコードがより快適に見えるようになります。ただし、「WeChat 開発者ツール」はデフォルトでは async/await をサポートしていません。有効にするにはどうすればよいですか?

1. async/await を使用する

興味がある場合は、公式 WeChat アプレット ドキュメントで async を検索すると、「ツール ⇒ 開発アシスタント」が見つかります。 ⇒ コード コンパイル 「async/await のサポートについては、ページに記載されています。これは、「コンパイルの追加」セクションの表にあります。抜粋があります:



1.02 の開発ツール.1904282 以降のバージョンでは、ES6 を ES5 に変換する機能を強化するために、拡張コンパイル オプションが追加されました。有効にすると、新しいコンパイル ロジックが使用され、開発者が使用できる追加のオプションが提供されます。

非同期/待機構文をサポートし、オンデマンドで regeneratorRuntime を挿入します。ディレクトリの場所は補助関数と一致します。

  • つまり、「WeChat Developer Tools」がv1.02.1904282以降にアップデートされていれば、npm install regeneratorなどの作業は必要なく、async/awaitを使用するように設定項目を変更するだけで済みます。特徴。この設定は「ツールバー⇒詳細⇒ローカル設定」ページにあります。

async/await が利用できることをすぐに確認するには、app.js の onLaunch() イベント関数にコードを追加します。 #短期間の自動コンパイル 実行後、デバッガー インターフェイスの [コンソール] タブに出力が表示されます: WeChat 開発での async/await の使用

(async () => {    const p = await new Promise(resolve => {
        setTimeout(() => resolve("hello async/await"), 1000);
    });    console.log(p);
})();
ログイン後にコピー

そうでない場合は、まず「WeChat 開発者ツール」のバージョンを確認してください - 少なくとも、最新バージョンのダウンロードは機能しません。問題があります。

2. wx.abcd 非同期メソッドの変換

async/await はサポートされていますが、wx.abcd を変更する必要があります。 () は Promise スタイルでカプセル化する必要があるだけです。 Node.js は、Node.js スタイルのコールバックを Promise スタイルに変換するための util モジュールで promisify を提供しますが、明らかに、これは wx スタイルでは機能しません。あまり考えずに自分でやってみてください。たとえば、wx スタイルの非同期呼び出しは形式的にはすべて一貫しています。その特徴は次のとおりです。 3 つの主要なコールバックを含むすべてのパラメータ


success: (res) => 非同期メソッドが成功したときの任意のコールバック

  • fail: (err) = > 非同期メソッドが失敗したときの任意のコールバック

  • ##complete: () => 非同期メソッドが完了したときの任意のコールバック (成功または失敗に関係なく)
  • ##したがって、wx.abcd() が Promise スタイルに変更され、async/await を通じて記述された場合、おそらく次のようになります。
  • hello async/await
    ログイン後にコピー
  • もちろん、catch 部分とfinally 部分はそうではありません。 Must、つまり、必ずしも try ブロックを使用する必要はありません。ただし、キャッチを使用しない場合、後述する落とし穴が発生します。今最初にやるべきことは変革です。

  • 2.1. 定義 promisify()

  • promisify() 就是一个封装函数,传入原来的 wx.abcd 作为参加,返回一个 Promise 风格的新函数。代码和解释如下:

    function promisify(fn) {
        // promisify() 返回的是一个函数,
        // 这个函数跟传入的 fn(即 wx.abcd) 签名相同(或兼容)
        return async function(args) {
        //                    ^^^^ 接受一个单一参数对象
            return new Promise((resolve, reject) => {
        //             ^^^^^^^^^^^ 返回一个 Promise 对象
                fn({
        //      ^^ ^ 调用原函数并使用改造过的新的参数对象
                    ...(args || {}),
        //          ^^^^^^^^        这个新参数对象得有原本传入的参数,
        //                      ^^  当然得兼容没有传入参数的情况
                    success: res => resolve(res),
        //          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^  注入 success 回调,resovle 它
                    fail: err => reject(err)
        //          ^^^^^^^^^^^^^^^^^^^^^^^^ 注入 fail 回调,reject 它
                });
            });
        };
    }
    ログイン後にコピー

    举例使用它:

    const asyncLogin = promisify(wx.login);  // 注意别写成 wx.login(),为什么,我不说
    try {
        const res = asyncLogin();
        const code = res.code;
        // do something with code
    } catch (err) {
        // login error
    } finally {
        // promisify 里没有专门注入 complete 回调,
        // 因为 complete 的内容可以写在这里
    }
    ログイン後にコピー

    2.2. 定义 wx.async()

    不过老实说,把要用的异步方法通过 promisify 一个个处理,写起来还是挺烦的,不如写个工具函数把要用的方法一次性转换出来。不过一查,wx 下定义了不知道多少异步方法,还是退而求其次,用到啥转啥,不过可以批量转,转出来的结果还是封装在一个对象中。整个过程就是迭代处理,最后把每个处理结果聚焦在一起:

    function toAsync(names) {    // 这里 names 期望是一个数组
        return (names || [])
            .map(name => (
                {
                    name,
                    member: wx[name]
                }
            ))
            .filter(t => typeof t.member === "function")
            .reduce((r, t) => {
                r[t.name] = promisify(wx[t.name]);
                return r;
            }, {});
    }
    ログイン後にコピー

    这个 toAsync 的用法大致是这样的

    const awx = toAsync(["login", "request"]);
    await awx.login();
    await awx.request({...});
    ログイン後にコピー

    有些人可能更习惯单个参数传入的方式,像这样

    const awx = toAsync("login", "request");
    ログイン後にコピー

    那么在 toAsync 的定义中,参数改为 ...names 就好,即

    function toAsync(...names) { ... }
    ログイン後にコピー

    还没完,因为我不想在每一个 JS 文件中去 import { toAsync } from ...。所以把它在 App.onLaunch() 中把它注入到 wx 对象中去,就像这样

    App({
        onLaunch: function() {
            // ...
            wx.async = toAsync;
            // ...
        }
    });
    ログイン後にコピー

    3. await 带来的神坑

    工具准备好了,代码也大刀阔斧地进行了改造,看起来舒服多了,一运行却报错!为什么???

    先来看一段原来的代码,是这样的

    wx.getStorage({
        key: "blabla",
        success: res => {
            // do with res
        }
    });
    ログイン後にコピー

    改造之后是这样

    const res = await awx.getStorage({ key: "blabla" });  // <== runtime error
    // do with res
    ログイン後にコピー

    awx.getStorage 抛了个异常,原因是叫 "blabal" 的这个数据不存在。

    为什么原来没有错,现在却报错?

    因为原来没有定义 fail 回调,所以错误被忽略了。但是 promisify() 把 fail 回调封装成了 reject(),所以 awx.getStorage() 返回的 Promise 对象上,需要通过 catch() 来处理。我们没有直接使用 Promise 对象,而是用的 await 语法,所以 reject() 会以抛出异常的形式体现出来。

    用人话说,代码得这样改:

    try {
        const res = await awx.getStorage({ key: "blabla" });  // <== runtime error
        // do with res
    } catch (err) {
        // 我知道有错,就是当它不存在!
    }
    ログイン後にコピー

    伤心了不是?如果没有伤心,你想想,每一个调用都要用 try ... catch ... 代码块,还能不伤心吗?

    3.1. 忽略不需要处理的错误

    处理错误真的是个好习惯,但真的不是所有错误情况都需要处理。其实要忽略错误也很简单,直接在每个 Promise 形式的异步调后面加句话就行,比如

    const res = await awx
        .getStorage({ key: "blabla" })
        .catch(() => {});
    //  ^^^^^^^^^^^^^^^^ 捕捉错误,但什么也不干
    ログイン後にコピー

    稍微解释一下,在这里 awx.getStorage() 返回一个 Promise 对象,对该对象调用 .catch() 会封装 reject 的情况,同时它会返回一个新的 Promise 对象,这个对象才是 await 等待的 Promise。

    不过感觉 .catch(() => {}) 写起来怪怪的,那就封装成一个方法吧,这得改 Promise 类的原形

    Promise.prototype.ignoreError = function() {
        return this.catch(() => { });
    };
    ログイン後にコピー

    这段代码放在定义 toAsync() 之前就好。

    用起来也像那么回事

    const res = await awx
        .getStorage({ key: "blabla" })
        .ignoreError();
    ログイン後にコピー

    对于单个 await 异步调用,如果不想写 try ... catch ... 块,还可以自己定义一个 ifError(fn) 来处理错误的情况。但是如果需要批量处理错误,还是 try ... catch ... 用起顺手:

    4. 回到开始

    try {
        const storeValue = await awx.getStorage({});
        const settings = await awx.getSetting();
        const { code } = await awx.login();
        const userInfo = await awx.getUserInfo({ code });
    } catch (err) {
        // 处理错误吧
    }
    ログイン後にコピー

    看,不需要对每个异步调用定义 fail 回调,一个 try ... catch ... 处理所有可能产生的错误,这可不也是 async/await 的优势!

    推荐教程: 《微信小程序

    以上がWeChat 開発での async/await の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Xianyu WeChat ミニプログラムが正式に開始 Xianyu WeChat ミニプログラムが正式に開始 Feb 10, 2024 pm 10:39 PM

Xianyu の公式 WeChat ミニ プログラムが静かに開始されました。ミニ プログラムでは、プライベート メッセージを投稿して購入者/販売者とコミュニケーションしたり、個人情報や注文を表示したり、商品を検索したりすることができます。プログラム、見てみましょう。 Xianyu WeChat アプレットの名前は何ですか? 回答: Xianyu、アイドル取引、中古品販売、評価、リサイクル。 1. ミニ プログラムでは、アイドル メッセージの投稿、プライベート メッセージを介した購入者/販売者とのコミュニケーション、個人情報と注文の表示、指定された商品の検索などができます。 2. ミニ プログラム ページには、ホームページ、近くに、アイドル投稿、メッセージ投稿、私の投稿 5つの機能; 3. 使用したい場合は、購入する前に WeChat 支払いを有効にする必要があります。

WeChatアプレットは画像アップロード機能を実装 WeChatアプレットは画像アップロード機能を実装 Nov 21, 2023 am 09:08 AM

WeChat アプレットが画像アップロード機能を実装 モバイル インターネットの発展に伴い、WeChat アプレットは人々の生活に欠かせないものになりました。 WeChat ミニ プログラムは、豊富なアプリケーション シナリオを提供するだけでなく、画像アップロード機能などの開発者定義の機能もサポートします。この記事では、WeChat アプレットに画像アップロード機能を実装する方法と具体的なコード例を紹介します。 1. 準備作業 コードを書き始める前に、WeChat 開発者ツールをダウンロードしてインストールし、WeChat 開発者として登録する必要があります。同時に、WeChat についても理解する必要があります。

WeChat アプレットにドロップダウン メニュー効果を実装する WeChat アプレットにドロップダウン メニュー効果を実装する Nov 21, 2023 pm 03:03 PM

WeChat ミニ プログラムでドロップダウン メニュー効果を実装するには、特定のコード サンプルが必要です。モバイル インターネットの普及に伴い、WeChat ミニ プログラムはインターネット開発の重要な部分となり、ますます多くの人が注目し始めています。 WeChat ミニ プログラムを使用します。 WeChat ミニ プログラムの開発は、従来の APP 開発よりも簡単かつ迅速ですが、特定の開発スキルを習得する必要もあります。 WeChat ミニ プログラムの開発では、ドロップダウン メニューが一般的な UI コンポーネントであり、より良いユーザー エクスペリエンスを実現します。この記事では、WeChat アプレットにドロップダウン メニュー効果を実装し、実用的な機能を提供する方法を詳しく紹介します。

WeChat アプレットを使用してカルーセル切り替え効果を実現する WeChat アプレットを使用してカルーセル切り替え効果を実現する Nov 21, 2023 pm 05:59 PM

WeChat アプレットを使用してカルーセル スイッチング効果を実現する WeChat アプレットは、シンプルで効率的な開発と使用特性を備えた軽量のアプリケーションです。 WeChat ミニ プログラムでは、カルーセル スイッチング効果を実現することが一般的な要件です。この記事では、WeChat アプレットを使用してカルーセル切り替え効果を実現する方法と、具体的なコード例を紹介します。まず、カルーセル コンポーネントを WeChat アプレットのページ ファイルに追加します。たとえば、&lt;swiper&gt; タグを使用すると、カルーセルの切り替え効果を実現できます。このコンポーネントでは、 b を渡すことができます。

WeChat ミニ プログラムに画像フィルター効果を実装する WeChat ミニ プログラムに画像フィルター効果を実装する Nov 21, 2023 pm 06:22 PM

WeChat ミニ プログラムでの画像フィルター効果の実装 ソーシャル メディア アプリケーションの人気に伴い、人々は写真にフィルター効果を適用して、写真の芸術的効果や魅力を高めることがますます好まれています。画像フィルター効果は WeChat ミニ プログラムにも実装でき、より興味深く創造的な写真編集機能をユーザーに提供します。この記事では、WeChat ミニ プログラムに画像フィルター効果を実装する方法を紹介し、具体的なコード例を示します。まず、WeChat アプレットのキャンバス コンポーネントを使用して画像を読み込み、編集する必要があります。 Canvasコンポーネントはページ上で使用できます

Xianyu WeChat アプレットの名前は何ですか? Xianyu WeChat アプレットの名前は何ですか? Feb 27, 2024 pm 01:11 PM

Xianyu の公式 WeChat ミニ プログラムが静かに開始され、アイドルアイテムを簡単に公開および交換できる便利なプラットフォームをユーザーに提供します。ミニ プログラムでは、プライベート メッセージを介して購入者または販売者とコミュニケーションしたり、個人情報や注文を表示したり、欲しい商品を検索したりできます。では、WeChat ミニ プログラムでは Xianyu とはいったい何と呼ばれているのでしょうか? このチュートリアル ガイドで詳しくご紹介しますので、知りたいユーザーは、この記事に従って読み続けてください。 Xianyu WeChat アプレットの名前は何ですか? 回答: Xianyu、アイドル取引、中古品販売、評価、リサイクル。 1. ミニ プログラムでは、アイドル メッセージの投稿、プライベート メッセージを介した購入者/販売者とのコミュニケーション、個人情報と注文の表示、指定された商品の検索などができます。 2. ミニ プログラム ページには、ホームページ、近くに、アイドル投稿、メッセージ投稿、マイ投稿の5つの機能、3.

WeChatミニプログラムにスライディング削除機能を実装する WeChatミニプログラムにスライディング削除機能を実装する Nov 21, 2023 pm 06:22 PM

WeChat ミニ プログラムにスライディング削除機能を実装するには、特定のコード サンプルが必要です。WeChat ミニ プログラムの人気に伴い、開発者は開発プロセス中にいくつかの一般的な機能を実装する際に問題に遭遇することがよくあります。中でも、スライド削除機能は、よく使われる一般的な機能要件です。この記事では、WeChat アプレットにスライディング削除機能を実装する方法と具体的なコード例を詳しく紹介します。 1. 要件分析 WeChat ミニ プログラムでは、スライド削除機能の実装には次の点が含まれます。 リスト表示: スライドして削除できるリストを表示するには、各リスト項目に次の要素が含まれている必要があります。

WeChat アプレットに画像回転効果を実装する WeChat アプレットに画像回転効果を実装する Nov 21, 2023 am 08:26 AM

WeChat ミニ プログラムで画像回転効果を実装するには、特定のコード サンプルが必要です。WeChat ミニ プログラムは、ユーザーに豊富な機能と優れたユーザー エクスペリエンスを提供する軽量のアプリケーションです。ミニ プログラムでは、開発者はさまざまなコンポーネントと API を使用して、さまざまな効果を実現できます。その中で、画像回転効果は、ミニプログラムに興味と視覚効果を加えることができる一般的なアニメーション効果です。 WeChat ミニ プログラムで画像の回転効果を実現するには、ミニ プログラムが提供するアニメーション API を使用する必要があります。以下は、その方法を示す具体的なコード例です。

See all articles