1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/fudiwei-wxmini-promisify

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

wxmini-promisify

В 2019 году, 16 июля, WeChat выпустил независимую библиотеку расширения для мини-программ — miniprogram-api-promise. Подробности можно найти по этой ссылке.

WeChat также поддержал форму вызова API Promise в мини-программах с версии 2.10.2 в 2020 году, 20 февраля. Подробности можно узнать по этой ссылке.

Эта библиотека будет продолжать обновляться.


Особенности

  • Преобразует API на основе функций в мини-приложениях WeChat, WeChat Games и корпоративных мини-приложений WeChat в форму Promise (wx.func преобразуется в wx.funcAsync с тем же именем);
  • Может быть отдельно скопирован в проект;
  • Поддерживает TypeScript;
  • Поддерживает uni-app, Taro и другие мультиплатформенные фреймворки, а также теоретически поддерживает все основные среды выполнения мини-программы (например, QQ Mini Program, Alipay Mini Program, DingTalk Mini Program, Douyin Mini Program, Headline Mini Program, Baidu Smart Mini Program и т. д.);
  • Синхронизируется с базовой библиотекой WeChat Mini Program (текущая версия: 3.0.0).

Использование

Установка:

npm install @skit/wxmini-promisify

Импорт:

const $ = require('@skit/wxmini-promisify');

$.promisifyAll({
    env: wx, // (необязательно) объект времени выполнения. Значение по умолчанию — wx.
    root: wx, // (необязательно) указывает, что асинхронные методы должны быть прикреплены к свойствам объекта. По умолчанию они прикрепляются к wx.
    extends: ['someNewApi'] // (необязательно) если базовая библиотека добавляет некоторые API, но эта библиотека ещё не обновлена, вы можете передать соответствующие имена методов, чтобы преобразовать их в асинхронные методы.
});

Использование асинхронных методов:

wx.loginAsync({ timeout: 5000 })
    .then((res) => {
        console.log('success', res);

        return wx.getUserProfileAsync({ desc: '获取用户资料' });
    })
    .then((res) => {
        console.log('success', res);

        return wx.requestAsync({
            method: 'GET',
            url: 'https://baidu.com'
        });
    })
    .then((res) => {
        console.log('success', res);
    })
    .catch((err) => {
        console.warn('fail', err);
    })
    .finally(() => {
        console.log('complete');
    });

/**
 * @example Приведённый выше пример кода эквивалентен следующему исходному коду:
 */
wx.login({
    timeout: 5000,
    success: (res) => {
        console.log('success', res);

        wx.getUserProfile({
            desc: '获取用户资料',
            success: (res) => {
                console.log('success', res);

                wx.request({
                    method: 'POST',
                    url: 'https://example.com/api/login',
                    success: (res) => {
                        console.log('success', res);
                    },
                    fail: (err) => {
                        console.warn('fail', err);
                    },
                    complete: () => {
                        console.log('complete');
                    }
                });
            },
            fail: (err) => {
                console.warn('fail', err);
            },
            complete: () => {
                console.log('complete');
            }
        });
    },
    fail: (err) => {
        console.warn('fail', err);
    },
    complete: () => {
        console.log('complete');
    }
});

Конечно, приведённый выше асинхронный код также можно переписать в виде async + await. Здесь мы не будем вдаваться в подробности.


Часто задаваемые вопросы

1. Как поддерживать асинхронность для таких методов, как wx.getFileSystemManager, wx.getUserCryptoManager, wx.createMapContext и wx.createBLEPeripheralServer?

Эти API не будут асинхронизированы с помощью promisifyAll, но вы можете сделать их асинхронными по отдельности следующим образом:

const fileSystemManager = wx.getFileSystemManager();
const openFileAsync = $.promisify(fileSystemManager.open);
openFileAsync({ filePath: 'myFilePath' });

2. Как получить возвращаемое значение исходного метода для таких методов, как wx.request, wx.uploadFile, wx.downloadFile и wx.connectSocket?

Хотя эти API являются асинхронными, исходный метод может иметь собственное возвращаемое значение, которое обычно имеет две цели: одна — добавить определённый прослушиватель событий (например, onProgressUpdate), другая — вызвать определённый метод (например, abort).

Для первого требования вы можете использовать следующий способ:

wx.requestAsync({
    method: 'GET',
    url: 'https://example.com',
    onHeadersReceived: (e) => {
        console.log('receive header', e.header);
    }
});

/**
 * @example Приведенный выше пример кода эквивалентен следующему исходному коду:
 */
const requestTask = Для запроса:

wx.request({ method: 'GET', url: 'https://example.com' }); requestTask.onHeadersReceived((e) => { console.log('receive header', e.header); });


Перевод:

wx.request({
метод: 'GET',
URL: 'https://example.com'
});
requestTask.onHeadersReceived(function (e) {
console.log("receive header", e.header);
});


Для запроса: 

对于后者需求,本库暂时无法满足,你仍可以使用原生方法来实现。

3. 在 TypeScript 中如何使用?

tsconfig.json 中加入:

{
    "compilerOptions": {
        "types": [
            ...
            "@skit/wxmini-promisify"
        ],
        ...
    }
}
这样就可以获得 TypeScript 的代码智能提示和类型检查等特性了。
如果你将异步 API 挂载到了非 `wx` 对象上,那么可能还需要显式地声明类型:
```typescript
let myRoot = {} as WechatMiniprogram.WxAsync;
$.promisifyAll({ root: myRoot });
Относительно последнего требования, эта библиотека в настоящее время не может его удовлетворить, вы все еще можете использовать нативные методы для реализации.
### 3. Использование в TypeScript
В `tsconfig.json`:
```json
{
  "compilerOptions": {
    "types": ["@skit/wxmini-promisify"]
  }
}

Это позволит получить интеллектуальные подсказки и проверку типов от TypeScript. Если вы прикрепили асинхронный API к объекту, отличному от wx, вам также может потребоваться явно объявить тип:

let myRoot = {} as WechatMiniprogram.WxAsync;
$.promisifyAll({ root: myRoot });

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Обеспечить поддержку TypeScript для небольших программ и игр в WeChat, а также преобразовать асинхронный API на основе функций обратного вызова в форму Promise. Развернуть Свернуть
JavaScript
MIT
Отмена

Обновления (2)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/fudiwei-wxmini-promisify.git
git@api.gitlife.ru:oschina-mirror/fudiwei-wxmini-promisify.git
oschina-mirror
fudiwei-wxmini-promisify
fudiwei-wxmini-promisify
main