предисловие
Стандарт ES6Promise
Решите более распространенную проблему ада обратных вызовов в коде Javascript с помощьюasync
/await
Асинхронная логика может быть написана синхронно, что значительно повышает эффективность разработки.
Но пока еще много не реализованных библиотекPromise
Интерфейс, включающий API апплета WeChat.
Чтобы не идти на компромисс со злыми силами и писать код с единым стилем, нам необходимо пониматьЧто такое обещание.
В этой статье предполагается, что читатель имеет некоторые базовые знания JavaScript и пониманиеPromise
базовое использование.
интерфейс обратного вызова
Интерфейс асинхронного обратного вызова относится к обработке вызовов асинхронных методов путем передачи функций.Как правило, существует два способа.
-
метод апплета
Передайте успешные и неудачные обратные вызовы отдельно для обработки двух разных случаев.
wx.showToast({ title: 'Hello, world', success: () => console.log('success'), fail: () => console.log('failure'), })
-
Путь MongoDB
Передайте обратный вызов с ошибкой в качестве первого параметра, чтобы определить, был ли вызов успешным или нет.
db.find({ name: 'Idan Loo' }, (err, data) => { if (err) { // err 是调用失败的原因 console.log(err) return } // data 就是异步传递回来的参数 console.log(data) })
У этих двух методов есть свои преимущества и недостатки.Здесь обсуждаются только метод WeChat и интерфейс метода MongoDB.Promise
Я считаю, что вы можете делать выводы друг о друге.
Обещать
Простая реализация
кshowToast
Например
const showToast = option =>
new Promise((resolve, reject) =>
wx.showToast({...option,
success: resolve,
fail: reject,
})
)
showToast({ title: 'Hello, Promise' })
.then(() => console.log('success'))
.catch(() => console.log('failure'))
ты уже знаешь какPromise
Чтобы упростить интерфейс апплета, теперь вам нужно только повторить приведенный выше код и изменить все интерфейсы, которые вам нужно использовать, чтобыPromise
возможно.
расширенная реализация
Хотя копирование и вставка челнока выполняется быстро, как программист, вы, естественно, должны стремиться к более лаконичной реализации.
По наблюдениям, все асинхронные интерфейсы апплета имеют одинаковую форму и расположены вwx
объект, поэтому мы можем абстрагироваться от общегоpromisify
способPromise
Интерфейс апплета
const promisify = name => option =>
new Promise((resolve, reject) =>
wx[name]({...option,
success: resolve,
fail: reject,
})
)
const showToast = promisify('showToast')
const request = promisify('request')
Теперь с помощью всего одной строки кода вы можетеPromise
Измените интерфейс апплета и быстро измените уродливый код обратного вызова, написанный ранее!
более продвинутая реализация
Если вы похожи на меня, чистота кода настолько неприемлема для приведенного выше кода, то поздравляю, черезProxyМы можем лучше достигать наших целей.
const pro = new Proxy(wx, {
get(target, prop) {
return promisify(prop)
}
})
pro.showToast({ title: 'Hello, world' }).then(...)
pro.request({ url: 'https://github.com' }).then(...)
существуетpromisify
метод, основанный наwx
К объекту добавлен прокси, и теперь вы можете использовать его какwx
использовать как объектpro
, и все асинхронные методы становятсяPromise
Форма!
Нет необходимости реализовать
Лучшая реализация — отдать другим, как я уже упаковал и загрузил код в предыдущей статье,minapp-promise, менее 1к, из коробки.
Это нелегко увидеть здесь, я надеюсь, что вы можете поставить мне лайк и, кстати, поставить мне звезду на GitHub.
Если в коде мобильного телефона есть ошибки или упущения, исправьте их.