В 2019 году, 16 июля, WeChat выпустил независимую библиотеку расширения для мини-программ — miniprogram-api-promise. Подробности можно найти по этой ссылке.
WeChat также поддержал форму вызова API Promise в мини-программах с версии 2.10.2 в 2020 году, 20 февраля. Подробности можно узнать по этой ссылке.
Эта библиотека будет продолжать обновляться.
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
. Здесь мы не будем вдаваться в подробности.
wx.getFileSystemManager
, wx.getUserCryptoManager
, wx.createMapContext
и wx.createBLEPeripheralServer
?Эти API не будут асинхронизированы с помощью promisifyAll
, но вы можете сделать их асинхронными по отдельности следующим образом:
const fileSystemManager = wx.getFileSystemManager();
const openFileAsync = $.promisify(fileSystemManager.open);
openFileAsync({ filePath: 'myFilePath' });
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);
});
Для запроса:
对于后者需求,本库暂时无法满足,你仍可以使用原生方法来实现。
在 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 )