├── README.md
├── app.js
├── app.json
├── app.wxss
├── pages
├── index
│ ├── index.js
│ ├── index.json
│ ├── index.wxml
│ └── index.wxss
└── new
│ ├── new.js
│ ├── new.json
│ ├── new.wxml
│ └── new.wxss
├── plugins
└── es6-promise.js
└── utils
├── config.js
├── util.js
├── wxApi.js
└── wxRequest.js
/README.md:
--------------------------------------------------------------------------------
1 | # es6-promise
2 | 微信小程序 之『引入es6 promise』
3 |
4 | 微信小程序开发两个月了.大家的项目都在不断迭代.已经不是小程序.这时候就会遇到多层回调嵌套的问题.有些目不忍视了.迫不得已引入es6-promise.在微信小程序内测的时候promise不需要手动引入,后来被微信移除了.
5 |
6 | promise详细的介绍我就不说了.有很多大神写过.
7 |
8 | [阮一峰 promise入门](http://es6.ruanyifeng.com/#docs/promise#Promise-all)
9 |
10 | [项目详情介绍](http://www.jianshu.com/p/aeb95c210b3c)
11 |
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | //app.js
2 | var config = require('utils/config')
3 | App({
4 | onLaunch: function () {
5 |
6 | },
7 | globalData: {
8 | ip: 'https://******',
9 | userInfo: null,
10 | },
11 | })
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "pages":[
3 | "pages/index/index",
4 | "pages/new/new"
5 | ],
6 | "window":{
7 | "backgroundTextStyle":"light",
8 | "navigationBarBackgroundColor": "#fff",
9 | "navigationBarTitleText": "promise",
10 | "navigationBarTextStyle":"black"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/app.wxss:
--------------------------------------------------------------------------------
1 | /**app.wxss**/
2 | .container {
3 | height: 100%;
4 | display: flex;
5 | flex-direction: column;
6 | align-items: center;
7 | justify-content: space-between;
8 | padding: 200rpx 0;
9 | box-sizing: border-box;
10 | }
11 |
--------------------------------------------------------------------------------
/pages/index/index.js:
--------------------------------------------------------------------------------
1 | //index.js
2 | var util = require('../../utils/util')
3 | var wxApi = require('../../utils/wxApi')
4 | var wxRequest = require('../../utils/wxRequest')
5 | import config from '../../utils/config'
6 | //获取应用实例
7 | var app = getApp()
8 | Page({
9 | data: {
10 | userInfo: {}
11 | },
12 | onLoad: function () {
13 | var that = this;
14 | wx.showToast({
15 | title: '加载中',
16 | icon: 'loading',
17 | duration: 10000
18 | })
19 | //1.获取code
20 | var wxLogin = wxApi.wxLogin()
21 | wxLogin().then(res => {
22 | console.log('1.成功了')
23 | console.log(res.code)
24 | var url = config.getOpenidUrl;
25 | var params = {
26 | appid: "wxed78****2d465",
27 | secret: "e9c5e4c*****9ecc5ebd811",
28 | js_code: res.code,
29 | grant_type: "authorization_code"
30 | }
31 | //2.获取openid
32 | return wxRequest.getRequest(url, params)
33 | }).
34 | then(res => {
35 | console.log('2.成功了')
36 | console.log(res)
37 | var url = app.globalData.ip + config.searchDgUrl
38 | var data = util.json2Form({ phoneNumber: '15971908021' })
39 | //3.获取绑定手机号码
40 | return wxRequest.postRequest(url, data)
41 | }).
42 | then(res => {
43 | console.log('3.成功了')
44 | console.log(res)
45 | //4.获取系统信息
46 | var wxGetSystemInfo = wxApi.wxGetSystemInfo()
47 | return wxGetSystemInfo()
48 | }).
49 | then(res => {
50 | console.log('4.成功了')
51 | console.log(res)
52 | //5.获取用户信息
53 | var wxGetUserInfo = wxApi.wxGetUserInfo()
54 | return wxGetUserInfo()
55 | }).
56 | then(res => {
57 | console.log('5.成功了')
58 | console.log(res.userInfo)
59 | that.setData({
60 | userInfo: res.userInfo
61 | })
62 | })
63 | .finally(function (res) {
64 | console.log('finally~')
65 | wx.hideToast()
66 | })
67 | }
68 | })
--------------------------------------------------------------------------------
/pages/index/index.json:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/pages/index/index.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | {{userInfo.nickName}}
6 |
7 |
8 |
--------------------------------------------------------------------------------
/pages/index/index.wxss:
--------------------------------------------------------------------------------
1 | /**index.wxss**/
2 | .userinfo {
3 | display: flex;
4 | flex-direction: column;
5 | align-items: center;
6 | }
7 |
8 | .userinfo-avatar {
9 | width: 128rpx;
10 | height: 128rpx;
11 | margin: 20rpx;
12 | border-radius: 50%;
13 | }
14 |
15 | .userinfo-nickname {
16 | color: #aaa;
17 | }
18 |
19 | .usermotto {
20 | margin-top: 200px;
21 | }
--------------------------------------------------------------------------------
/pages/new/new.js:
--------------------------------------------------------------------------------
1 | // pages/new/new.js
2 | Page({
3 | data:{},
4 | onLoad:function(options){
5 | // 页面初始化 options为页面跳转所带来的参数
6 | },
7 | onReady:function(){
8 | // 页面渲染完成
9 | },
10 | onShow:function(){
11 | // 页面显示
12 | },
13 | onHide:function(){
14 | // 页面隐藏
15 | },
16 | onUnload:function(){
17 | // 页面关闭
18 | }
19 | })
--------------------------------------------------------------------------------
/pages/new/new.json:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/pages/new/new.wxml:
--------------------------------------------------------------------------------
1 |
2 | pages/new/new.wxml
3 |
--------------------------------------------------------------------------------
/pages/new/new.wxss:
--------------------------------------------------------------------------------
1 | /* pages/new/new.wxss */
--------------------------------------------------------------------------------
/plugins/es6-promise.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * @overview es6-promise - a tiny implementation of Promises/A+.
3 | * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
4 | * @license Licensed under MIT license
5 | * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
6 | * @version 4.0.5
7 | */
8 |
9 | (function (global, factory) {
10 | typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
11 | typeof define === 'function' && define.amd ? define(factory) :
12 | (global.ES6Promise = factory());
13 | }(this, (function () { 'use strict';
14 |
15 | function objectOrFunction(x) {
16 | return typeof x === 'function' || typeof x === 'object' && x !== null;
17 | }
18 |
19 | function isFunction(x) {
20 | return typeof x === 'function';
21 | }
22 |
23 | var _isArray = undefined;
24 | if (!Array.isArray) {
25 | _isArray = function (x) {
26 | return Object.prototype.toString.call(x) === '[object Array]';
27 | };
28 | } else {
29 | _isArray = Array.isArray;
30 | }
31 |
32 | var isArray = _isArray;
33 |
34 | var len = 0;
35 | var vertxNext = undefined;
36 | var customSchedulerFn = undefined;
37 |
38 | var asap = function asap(callback, arg) {
39 | queue[len] = callback;
40 | queue[len + 1] = arg;
41 | len += 2;
42 | if (len === 2) {
43 | // If len is 2, that means that we need to schedule an async flush.
44 | // If additional callbacks are queued before the queue is flushed, they
45 | // will be processed by this flush that we are scheduling.
46 | if (customSchedulerFn) {
47 | customSchedulerFn(flush);
48 | } else {
49 | scheduleFlush();
50 | }
51 | }
52 | };
53 |
54 | function setScheduler(scheduleFn) {
55 | customSchedulerFn = scheduleFn;
56 | }
57 |
58 | function setAsap(asapFn) {
59 | asap = asapFn;
60 | }
61 |
62 | var browserWindow = typeof window !== 'undefined' ? window : undefined;
63 | var browserGlobal = browserWindow || {};
64 | var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
65 | var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';
66 |
67 | // test for web worker but not in IE10
68 | var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
69 |
70 | // node
71 | function useNextTick() {
72 | // node version 0.10.x displays a deprecation warning when nextTick is used recursively
73 | // see https://github.com/cujojs/when/issues/410 for details
74 | return function () {
75 | return process.nextTick(flush);
76 | };
77 | }
78 |
79 | // vertx
80 | function useVertxTimer() {
81 | if (typeof vertxNext !== 'undefined') {
82 | return function () {
83 | vertxNext(flush);
84 | };
85 | }
86 |
87 | return useSetTimeout();
88 | }
89 |
90 | function useMutationObserver() {
91 | var iterations = 0;
92 | var observer = new BrowserMutationObserver(flush);
93 | var node = document.createTextNode('');
94 | observer.observe(node, { characterData: true });
95 |
96 | return function () {
97 | node.data = iterations = ++iterations % 2;
98 | };
99 | }
100 |
101 | // web worker
102 | function useMessageChannel() {
103 | var channel = new MessageChannel();
104 | channel.port1.onmessage = flush;
105 | return function () {
106 | return channel.port2.postMessage(0);
107 | };
108 | }
109 |
110 | function useSetTimeout() {
111 | // Store setTimeout reference so es6-promise will be unaffected by
112 | // other code modifying setTimeout (like sinon.useFakeTimers())
113 | var globalSetTimeout = setTimeout;
114 | return function () {
115 | return globalSetTimeout(flush, 1);
116 | };
117 | }
118 |
119 | var queue = new Array(1000);
120 | function flush() {
121 | for (var i = 0; i < len; i += 2) {
122 | var callback = queue[i];
123 | var arg = queue[i + 1];
124 |
125 | callback(arg);
126 |
127 | queue[i] = undefined;
128 | queue[i + 1] = undefined;
129 | }
130 |
131 | len = 0;
132 | }
133 |
134 | function attemptVertx() {
135 | try {
136 | var r = require;
137 | var vertx = r('vertx');
138 | vertxNext = vertx.runOnLoop || vertx.runOnContext;
139 | return useVertxTimer();
140 | } catch (e) {
141 | return useSetTimeout();
142 | }
143 | }
144 |
145 | var scheduleFlush = undefined;
146 | // Decide what async method to use to triggering processing of queued callbacks:
147 | if (isNode) {
148 | scheduleFlush = useNextTick();
149 | } else if (BrowserMutationObserver) {
150 | scheduleFlush = useMutationObserver();
151 | } else if (isWorker) {
152 | scheduleFlush = useMessageChannel();
153 | } else if (browserWindow === undefined && typeof require === 'function') {
154 | scheduleFlush = attemptVertx();
155 | } else {
156 | scheduleFlush = useSetTimeout();
157 | }
158 |
159 | function then(onFulfillment, onRejection) {
160 | var _arguments = arguments;
161 |
162 | var parent = this;
163 |
164 | var child = new this.constructor(noop);
165 |
166 | if (child[PROMISE_ID] === undefined) {
167 | makePromise(child);
168 | }
169 |
170 | var _state = parent._state;
171 |
172 | if (_state) {
173 | (function () {
174 | var callback = _arguments[_state - 1];
175 | asap(function () {
176 | return invokeCallback(_state, child, callback, parent._result);
177 | });
178 | })();
179 | } else {
180 | subscribe(parent, child, onFulfillment, onRejection);
181 | }
182 |
183 | return child;
184 | }
185 |
186 | /**
187 | `Promise.resolve` returns a promise that will become resolved with the
188 | passed `value`. It is shorthand for the following:
189 |
190 | ```javascript
191 | let promise = new Promise(function(resolve, reject){
192 | resolve(1);
193 | });
194 |
195 | promise.then(function(value){
196 | // value === 1
197 | });
198 | ```
199 |
200 | Instead of writing the above, your code now simply becomes the following:
201 |
202 | ```javascript
203 | let promise = Promise.resolve(1);
204 |
205 | promise.then(function(value){
206 | // value === 1
207 | });
208 | ```
209 |
210 | @method resolve
211 | @static
212 | @param {Any} value value that the returned promise will be resolved with
213 | Useful for tooling.
214 | @return {Promise} a promise that will become fulfilled with the given
215 | `value`
216 | */
217 | function resolve(object) {
218 | /*jshint validthis:true */
219 | var Constructor = this;
220 |
221 | if (object && typeof object === 'object' && object.constructor === Constructor) {
222 | return object;
223 | }
224 |
225 | var promise = new Constructor(noop);
226 | _resolve(promise, object);
227 | return promise;
228 | }
229 |
230 | var PROMISE_ID = Math.random().toString(36).substring(16);
231 |
232 | function noop() {}
233 |
234 | var PENDING = void 0;
235 | var FULFILLED = 1;
236 | var REJECTED = 2;
237 |
238 | var GET_THEN_ERROR = new ErrorObject();
239 |
240 | function selfFulfillment() {
241 | return new TypeError("You cannot resolve a promise with itself");
242 | }
243 |
244 | function cannotReturnOwn() {
245 | return new TypeError('A promises callback cannot return that same promise.');
246 | }
247 |
248 | function getThen(promise) {
249 | try {
250 | return promise.then;
251 | } catch (error) {
252 | GET_THEN_ERROR.error = error;
253 | return GET_THEN_ERROR;
254 | }
255 | }
256 |
257 | function tryThen(then, value, fulfillmentHandler, rejectionHandler) {
258 | try {
259 | then.call(value, fulfillmentHandler, rejectionHandler);
260 | } catch (e) {
261 | return e;
262 | }
263 | }
264 |
265 | function handleForeignThenable(promise, thenable, then) {
266 | asap(function (promise) {
267 | var sealed = false;
268 | var error = tryThen(then, thenable, function (value) {
269 | if (sealed) {
270 | return;
271 | }
272 | sealed = true;
273 | if (thenable !== value) {
274 | _resolve(promise, value);
275 | } else {
276 | fulfill(promise, value);
277 | }
278 | }, function (reason) {
279 | if (sealed) {
280 | return;
281 | }
282 | sealed = true;
283 |
284 | _reject(promise, reason);
285 | }, 'Settle: ' + (promise._label || ' unknown promise'));
286 |
287 | if (!sealed && error) {
288 | sealed = true;
289 | _reject(promise, error);
290 | }
291 | }, promise);
292 | }
293 |
294 | function handleOwnThenable(promise, thenable) {
295 | if (thenable._state === FULFILLED) {
296 | fulfill(promise, thenable._result);
297 | } else if (thenable._state === REJECTED) {
298 | _reject(promise, thenable._result);
299 | } else {
300 | subscribe(thenable, undefined, function (value) {
301 | return _resolve(promise, value);
302 | }, function (reason) {
303 | return _reject(promise, reason);
304 | });
305 | }
306 | }
307 |
308 | function handleMaybeThenable(promise, maybeThenable, then$$) {
309 | if (maybeThenable.constructor === promise.constructor && then$$ === then && maybeThenable.constructor.resolve === resolve) {
310 | handleOwnThenable(promise, maybeThenable);
311 | } else {
312 | if (then$$ === GET_THEN_ERROR) {
313 | _reject(promise, GET_THEN_ERROR.error);
314 | } else if (then$$ === undefined) {
315 | fulfill(promise, maybeThenable);
316 | } else if (isFunction(then$$)) {
317 | handleForeignThenable(promise, maybeThenable, then$$);
318 | } else {
319 | fulfill(promise, maybeThenable);
320 | }
321 | }
322 | }
323 |
324 | function _resolve(promise, value) {
325 | if (promise === value) {
326 | _reject(promise, selfFulfillment());
327 | } else if (objectOrFunction(value)) {
328 | handleMaybeThenable(promise, value, getThen(value));
329 | } else {
330 | fulfill(promise, value);
331 | }
332 | }
333 |
334 | function publishRejection(promise) {
335 | if (promise._onerror) {
336 | promise._onerror(promise._result);
337 | }
338 |
339 | publish(promise);
340 | }
341 |
342 | function fulfill(promise, value) {
343 | if (promise._state !== PENDING) {
344 | return;
345 | }
346 |
347 | promise._result = value;
348 | promise._state = FULFILLED;
349 |
350 | if (promise._subscribers.length !== 0) {
351 | asap(publish, promise);
352 | }
353 | }
354 |
355 | function _reject(promise, reason) {
356 | if (promise._state !== PENDING) {
357 | return;
358 | }
359 | promise._state = REJECTED;
360 | promise._result = reason;
361 |
362 | asap(publishRejection, promise);
363 | }
364 |
365 | function subscribe(parent, child, onFulfillment, onRejection) {
366 | var _subscribers = parent._subscribers;
367 | var length = _subscribers.length;
368 |
369 | parent._onerror = null;
370 |
371 | _subscribers[length] = child;
372 | _subscribers[length + FULFILLED] = onFulfillment;
373 | _subscribers[length + REJECTED] = onRejection;
374 |
375 | if (length === 0 && parent._state) {
376 | asap(publish, parent);
377 | }
378 | }
379 |
380 | function publish(promise) {
381 | var subscribers = promise._subscribers;
382 | var settled = promise._state;
383 |
384 | if (subscribers.length === 0) {
385 | return;
386 | }
387 |
388 | var child = undefined,
389 | callback = undefined,
390 | detail = promise._result;
391 |
392 | for (var i = 0; i < subscribers.length; i += 3) {
393 | child = subscribers[i];
394 | callback = subscribers[i + settled];
395 |
396 | if (child) {
397 | invokeCallback(settled, child, callback, detail);
398 | } else {
399 | callback(detail);
400 | }
401 | }
402 |
403 | promise._subscribers.length = 0;
404 | }
405 |
406 | function ErrorObject() {
407 | this.error = null;
408 | }
409 |
410 | var TRY_CATCH_ERROR = new ErrorObject();
411 |
412 | function tryCatch(callback, detail) {
413 | try {
414 | return callback(detail);
415 | } catch (e) {
416 | TRY_CATCH_ERROR.error = e;
417 | return TRY_CATCH_ERROR;
418 | }
419 | }
420 |
421 | function invokeCallback(settled, promise, callback, detail) {
422 | var hasCallback = isFunction(callback),
423 | value = undefined,
424 | error = undefined,
425 | succeeded = undefined,
426 | failed = undefined;
427 |
428 | if (hasCallback) {
429 | value = tryCatch(callback, detail);
430 |
431 | if (value === TRY_CATCH_ERROR) {
432 | failed = true;
433 | error = value.error;
434 | value = null;
435 | } else {
436 | succeeded = true;
437 | }
438 |
439 | if (promise === value) {
440 | _reject(promise, cannotReturnOwn());
441 | return;
442 | }
443 | } else {
444 | value = detail;
445 | succeeded = true;
446 | }
447 |
448 | if (promise._state !== PENDING) {
449 | // noop
450 | } else if (hasCallback && succeeded) {
451 | _resolve(promise, value);
452 | } else if (failed) {
453 | _reject(promise, error);
454 | } else if (settled === FULFILLED) {
455 | fulfill(promise, value);
456 | } else if (settled === REJECTED) {
457 | _reject(promise, value);
458 | }
459 | }
460 |
461 | function initializePromise(promise, resolver) {
462 | try {
463 | resolver(function resolvePromise(value) {
464 | _resolve(promise, value);
465 | }, function rejectPromise(reason) {
466 | _reject(promise, reason);
467 | });
468 | } catch (e) {
469 | _reject(promise, e);
470 | }
471 | }
472 |
473 | var id = 0;
474 | function nextId() {
475 | return id++;
476 | }
477 |
478 | function makePromise(promise) {
479 | promise[PROMISE_ID] = id++;
480 | promise._state = undefined;
481 | promise._result = undefined;
482 | promise._subscribers = [];
483 | }
484 |
485 | function Enumerator(Constructor, input) {
486 | this._instanceConstructor = Constructor;
487 | this.promise = new Constructor(noop);
488 |
489 | if (!this.promise[PROMISE_ID]) {
490 | makePromise(this.promise);
491 | }
492 |
493 | if (isArray(input)) {
494 | this._input = input;
495 | this.length = input.length;
496 | this._remaining = input.length;
497 |
498 | this._result = new Array(this.length);
499 |
500 | if (this.length === 0) {
501 | fulfill(this.promise, this._result);
502 | } else {
503 | this.length = this.length || 0;
504 | this._enumerate();
505 | if (this._remaining === 0) {
506 | fulfill(this.promise, this._result);
507 | }
508 | }
509 | } else {
510 | _reject(this.promise, validationError());
511 | }
512 | }
513 |
514 | function validationError() {
515 | return new Error('Array Methods must be provided an Array');
516 | };
517 |
518 | Enumerator.prototype._enumerate = function () {
519 | var length = this.length;
520 | var _input = this._input;
521 |
522 | for (var i = 0; this._state === PENDING && i < length; i++) {
523 | this._eachEntry(_input[i], i);
524 | }
525 | };
526 |
527 | Enumerator.prototype._eachEntry = function (entry, i) {
528 | var c = this._instanceConstructor;
529 | var resolve$$ = c.resolve;
530 |
531 | if (resolve$$ === resolve) {
532 | var _then = getThen(entry);
533 |
534 | if (_then === then && entry._state !== PENDING) {
535 | this._settledAt(entry._state, i, entry._result);
536 | } else if (typeof _then !== 'function') {
537 | this._remaining--;
538 | this._result[i] = entry;
539 | } else if (c === Promise) {
540 | var promise = new c(noop);
541 | handleMaybeThenable(promise, entry, _then);
542 | this._willSettleAt(promise, i);
543 | } else {
544 | this._willSettleAt(new c(function (resolve$$) {
545 | return resolve$$(entry);
546 | }), i);
547 | }
548 | } else {
549 | this._willSettleAt(resolve$$(entry), i);
550 | }
551 | };
552 |
553 | Enumerator.prototype._settledAt = function (state, i, value) {
554 | var promise = this.promise;
555 |
556 | if (promise._state === PENDING) {
557 | this._remaining--;
558 |
559 | if (state === REJECTED) {
560 | _reject(promise, value);
561 | } else {
562 | this._result[i] = value;
563 | }
564 | }
565 |
566 | if (this._remaining === 0) {
567 | fulfill(promise, this._result);
568 | }
569 | };
570 |
571 | Enumerator.prototype._willSettleAt = function (promise, i) {
572 | var enumerator = this;
573 |
574 | subscribe(promise, undefined, function (value) {
575 | return enumerator._settledAt(FULFILLED, i, value);
576 | }, function (reason) {
577 | return enumerator._settledAt(REJECTED, i, reason);
578 | });
579 | };
580 |
581 | /**
582 | `Promise.all` accepts an array of promises, and returns a new promise which
583 | is fulfilled with an array of fulfillment values for the passed promises, or
584 | rejected with the reason of the first passed promise to be rejected. It casts all
585 | elements of the passed iterable to promises as it runs this algorithm.
586 |
587 | Example:
588 |
589 | ```javascript
590 | let promise1 = resolve(1);
591 | let promise2 = resolve(2);
592 | let promise3 = resolve(3);
593 | let promises = [ promise1, promise2, promise3 ];
594 |
595 | Promise.all(promises).then(function(array){
596 | // The array here would be [ 1, 2, 3 ];
597 | });
598 | ```
599 |
600 | If any of the `promises` given to `all` are rejected, the first promise
601 | that is rejected will be given as an argument to the returned promises's
602 | rejection handler. For example:
603 |
604 | Example:
605 |
606 | ```javascript
607 | let promise1 = resolve(1);
608 | let promise2 = reject(new Error("2"));
609 | let promise3 = reject(new Error("3"));
610 | let promises = [ promise1, promise2, promise3 ];
611 |
612 | Promise.all(promises).then(function(array){
613 | // Code here never runs because there are rejected promises!
614 | }, function(error) {
615 | // error.message === "2"
616 | });
617 | ```
618 |
619 | @method all
620 | @static
621 | @param {Array} entries array of promises
622 | @param {String} label optional string for labeling the promise.
623 | Useful for tooling.
624 | @return {Promise} promise that is fulfilled when all `promises` have been
625 | fulfilled, or rejected if any of them become rejected.
626 | @static
627 | */
628 | function all(entries) {
629 | return new Enumerator(this, entries).promise;
630 | }
631 |
632 | /**
633 | `Promise.race` returns a new promise which is settled in the same way as the
634 | first passed promise to settle.
635 |
636 | Example:
637 |
638 | ```javascript
639 | let promise1 = new Promise(function(resolve, reject){
640 | setTimeout(function(){
641 | resolve('promise 1');
642 | }, 200);
643 | });
644 |
645 | let promise2 = new Promise(function(resolve, reject){
646 | setTimeout(function(){
647 | resolve('promise 2');
648 | }, 100);
649 | });
650 |
651 | Promise.race([promise1, promise2]).then(function(result){
652 | // result === 'promise 2' because it was resolved before promise1
653 | // was resolved.
654 | });
655 | ```
656 |
657 | `Promise.race` is deterministic in that only the state of the first
658 | settled promise matters. For example, even if other promises given to the
659 | `promises` array argument are resolved, but the first settled promise has
660 | become rejected before the other promises became fulfilled, the returned
661 | promise will become rejected:
662 |
663 | ```javascript
664 | let promise1 = new Promise(function(resolve, reject){
665 | setTimeout(function(){
666 | resolve('promise 1');
667 | }, 200);
668 | });
669 |
670 | let promise2 = new Promise(function(resolve, reject){
671 | setTimeout(function(){
672 | reject(new Error('promise 2'));
673 | }, 100);
674 | });
675 |
676 | Promise.race([promise1, promise2]).then(function(result){
677 | // Code here never runs
678 | }, function(reason){
679 | // reason.message === 'promise 2' because promise 2 became rejected before
680 | // promise 1 became fulfilled
681 | });
682 | ```
683 |
684 | An example real-world use case is implementing timeouts:
685 |
686 | ```javascript
687 | Promise.race([ajax('foo.json'), timeout(5000)])
688 | ```
689 |
690 | @method race
691 | @static
692 | @param {Array} promises array of promises to observe
693 | Useful for tooling.
694 | @return {Promise} a promise which settles in the same way as the first passed
695 | promise to settle.
696 | */
697 | function race(entries) {
698 | /*jshint validthis:true */
699 | var Constructor = this;
700 |
701 | if (!isArray(entries)) {
702 | return new Constructor(function (_, reject) {
703 | return reject(new TypeError('You must pass an array to race.'));
704 | });
705 | } else {
706 | return new Constructor(function (resolve, reject) {
707 | var length = entries.length;
708 | for (var i = 0; i < length; i++) {
709 | Constructor.resolve(entries[i]).then(resolve, reject);
710 | }
711 | });
712 | }
713 | }
714 |
715 | /**
716 | `Promise.reject` returns a promise rejected with the passed `reason`.
717 | It is shorthand for the following:
718 |
719 | ```javascript
720 | let promise = new Promise(function(resolve, reject){
721 | reject(new Error('WHOOPS'));
722 | });
723 |
724 | promise.then(function(value){
725 | // Code here doesn't run because the promise is rejected!
726 | }, function(reason){
727 | // reason.message === 'WHOOPS'
728 | });
729 | ```
730 |
731 | Instead of writing the above, your code now simply becomes the following:
732 |
733 | ```javascript
734 | let promise = Promise.reject(new Error('WHOOPS'));
735 |
736 | promise.then(function(value){
737 | // Code here doesn't run because the promise is rejected!
738 | }, function(reason){
739 | // reason.message === 'WHOOPS'
740 | });
741 | ```
742 |
743 | @method reject
744 | @static
745 | @param {Any} reason value that the returned promise will be rejected with.
746 | Useful for tooling.
747 | @return {Promise} a promise rejected with the given `reason`.
748 | */
749 | function reject(reason) {
750 | /*jshint validthis:true */
751 | var Constructor = this;
752 | var promise = new Constructor(noop);
753 | _reject(promise, reason);
754 | return promise;
755 | }
756 |
757 | function needsResolver() {
758 | throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
759 | }
760 |
761 | function needsNew() {
762 | throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
763 | }
764 |
765 | /**
766 | Promise objects represent the eventual result of an asynchronous operation. The
767 | primary way of interacting with a promise is through its `then` method, which
768 | registers callbacks to receive either a promise's eventual value or the reason
769 | why the promise cannot be fulfilled.
770 |
771 | Terminology
772 | -----------
773 |
774 | - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
775 | - `thenable` is an object or function that defines a `then` method.
776 | - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
777 | - `exception` is a value that is thrown using the throw statement.
778 | - `reason` is a value that indicates why a promise was rejected.
779 | - `settled` the final resting state of a promise, fulfilled or rejected.
780 |
781 | A promise can be in one of three states: pending, fulfilled, or rejected.
782 |
783 | Promises that are fulfilled have a fulfillment value and are in the fulfilled
784 | state. Promises that are rejected have a rejection reason and are in the
785 | rejected state. A fulfillment value is never a thenable.
786 |
787 | Promises can also be said to *resolve* a value. If this value is also a
788 | promise, then the original promise's settled state will match the value's
789 | settled state. So a promise that *resolves* a promise that rejects will
790 | itself reject, and a promise that *resolves* a promise that fulfills will
791 | itself fulfill.
792 |
793 |
794 | Basic Usage:
795 | ------------
796 |
797 | ```js
798 | let promise = new Promise(function(resolve, reject) {
799 | // on success
800 | resolve(value);
801 |
802 | // on failure
803 | reject(reason);
804 | });
805 |
806 | promise.then(function(value) {
807 | // on fulfillment
808 | }, function(reason) {
809 | // on rejection
810 | });
811 | ```
812 |
813 | Advanced Usage:
814 | ---------------
815 |
816 | Promises shine when abstracting away asynchronous interactions such as
817 | `XMLHttpRequest`s.
818 |
819 | ```js
820 | function getJSON(url) {
821 | return new Promise(function(resolve, reject){
822 | let xhr = new XMLHttpRequest();
823 |
824 | xhr.open('GET', url);
825 | xhr.onreadystatechange = handler;
826 | xhr.responseType = 'json';
827 | xhr.setRequestHeader('Accept', 'application/json');
828 | xhr.send();
829 |
830 | function handler() {
831 | if (this.readyState === this.DONE) {
832 | if (this.status === 200) {
833 | resolve(this.response);
834 | } else {
835 | reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
836 | }
837 | }
838 | };
839 | });
840 | }
841 |
842 | getJSON('/posts.json').then(function(json) {
843 | // on fulfillment
844 | }, function(reason) {
845 | // on rejection
846 | });
847 | ```
848 |
849 | Unlike callbacks, promises are great composable primitives.
850 |
851 | ```js
852 | Promise.all([
853 | getJSON('/posts'),
854 | getJSON('/comments')
855 | ]).then(function(values){
856 | values[0] // => postsJSON
857 | values[1] // => commentsJSON
858 |
859 | return values;
860 | });
861 | ```
862 |
863 | @class Promise
864 | @param {function} resolver
865 | Useful for tooling.
866 | @constructor
867 | */
868 | function Promise(resolver) {
869 | this[PROMISE_ID] = nextId();
870 | this._result = this._state = undefined;
871 | this._subscribers = [];
872 |
873 | if (noop !== resolver) {
874 | typeof resolver !== 'function' && needsResolver();
875 | this instanceof Promise ? initializePromise(this, resolver) : needsNew();
876 | }
877 | }
878 |
879 | Promise.all = all;
880 | Promise.race = race;
881 | Promise.resolve = resolve;
882 | Promise.reject = reject;
883 | Promise._setScheduler = setScheduler;
884 | Promise._setAsap = setAsap;
885 | Promise._asap = asap;
886 |
887 | Promise.prototype = {
888 | constructor: Promise,
889 |
890 | /**
891 | The primary way of interacting with a promise is through its `then` method,
892 | which registers callbacks to receive either a promise's eventual value or the
893 | reason why the promise cannot be fulfilled.
894 |
895 | ```js
896 | findUser().then(function(user){
897 | // user is available
898 | }, function(reason){
899 | // user is unavailable, and you are given the reason why
900 | });
901 | ```
902 |
903 | Chaining
904 | --------
905 |
906 | The return value of `then` is itself a promise. This second, 'downstream'
907 | promise is resolved with the return value of the first promise's fulfillment
908 | or rejection handler, or rejected if the handler throws an exception.
909 |
910 | ```js
911 | findUser().then(function (user) {
912 | return user.name;
913 | }, function (reason) {
914 | return 'default name';
915 | }).then(function (userName) {
916 | // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
917 | // will be `'default name'`
918 | });
919 |
920 | findUser().then(function (user) {
921 | throw new Error('Found user, but still unhappy');
922 | }, function (reason) {
923 | throw new Error('`findUser` rejected and we're unhappy');
924 | }).then(function (value) {
925 | // never reached
926 | }, function (reason) {
927 | // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
928 | // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
929 | });
930 | ```
931 | If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
932 |
933 | ```js
934 | findUser().then(function (user) {
935 | throw new PedagogicalException('Upstream error');
936 | }).then(function (value) {
937 | // never reached
938 | }).then(function (value) {
939 | // never reached
940 | }, function (reason) {
941 | // The `PedgagocialException` is propagated all the way down to here
942 | });
943 | ```
944 |
945 | Assimilation
946 | ------------
947 |
948 | Sometimes the value you want to propagate to a downstream promise can only be
949 | retrieved asynchronously. This can be achieved by returning a promise in the
950 | fulfillment or rejection handler. The downstream promise will then be pending
951 | until the returned promise is settled. This is called *assimilation*.
952 |
953 | ```js
954 | findUser().then(function (user) {
955 | return findCommentsByAuthor(user);
956 | }).then(function (comments) {
957 | // The user's comments are now available
958 | });
959 | ```
960 |
961 | If the assimliated promise rejects, then the downstream promise will also reject.
962 |
963 | ```js
964 | findUser().then(function (user) {
965 | return findCommentsByAuthor(user);
966 | }).then(function (comments) {
967 | // If `findCommentsByAuthor` fulfills, we'll have the value here
968 | }, function (reason) {
969 | // If `findCommentsByAuthor` rejects, we'll have the reason here
970 | });
971 | ```
972 |
973 | Simple Example
974 | --------------
975 |
976 | Synchronous Example
977 |
978 | ```javascript
979 | let result;
980 |
981 | try {
982 | result = findResult();
983 | // success
984 | } catch(reason) {
985 | // failure
986 | }
987 | ```
988 |
989 | Errback Example
990 |
991 | ```js
992 | findResult(function(result, err){
993 | if (err) {
994 | // failure
995 | } else {
996 | // success
997 | }
998 | });
999 | ```
1000 |
1001 | Promise Example;
1002 |
1003 | ```javascript
1004 | findResult().then(function(result){
1005 | // success
1006 | }, function(reason){
1007 | // failure
1008 | });
1009 | ```
1010 |
1011 | Advanced Example
1012 | --------------
1013 |
1014 | Synchronous Example
1015 |
1016 | ```javascript
1017 | let author, books;
1018 |
1019 | try {
1020 | author = findAuthor();
1021 | books = findBooksByAuthor(author);
1022 | // success
1023 | } catch(reason) {
1024 | // failure
1025 | }
1026 | ```
1027 |
1028 | Errback Example
1029 |
1030 | ```js
1031 |
1032 | function foundBooks(books) {
1033 |
1034 | }
1035 |
1036 | function failure(reason) {
1037 |
1038 | }
1039 |
1040 | findAuthor(function(author, err){
1041 | if (err) {
1042 | failure(err);
1043 | // failure
1044 | } else {
1045 | try {
1046 | findBoooksByAuthor(author, function(books, err) {
1047 | if (err) {
1048 | failure(err);
1049 | } else {
1050 | try {
1051 | foundBooks(books);
1052 | } catch(reason) {
1053 | failure(reason);
1054 | }
1055 | }
1056 | });
1057 | } catch(error) {
1058 | failure(err);
1059 | }
1060 | // success
1061 | }
1062 | });
1063 | ```
1064 |
1065 | Promise Example;
1066 |
1067 | ```javascript
1068 | findAuthor().
1069 | then(findBooksByAuthor).
1070 | then(function(books){
1071 | // found books
1072 | }).catch(function(reason){
1073 | // something went wrong
1074 | });
1075 | ```
1076 |
1077 | @method then
1078 | @param {Function} onFulfilled
1079 | @param {Function} onRejected
1080 | Useful for tooling.
1081 | @return {Promise}
1082 | */
1083 | then: then,
1084 |
1085 | /**
1086 | `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
1087 | as the catch block of a try/catch statement.
1088 |
1089 | ```js
1090 | function findAuthor(){
1091 | throw new Error('couldn't find that author');
1092 | }
1093 |
1094 | // synchronous
1095 | try {
1096 | findAuthor();
1097 | } catch(reason) {
1098 | // something went wrong
1099 | }
1100 |
1101 | // async with promises
1102 | findAuthor().catch(function(reason){
1103 | // something went wrong
1104 | });
1105 | ```
1106 |
1107 | @method catch
1108 | @param {Function} onRejection
1109 | Useful for tooling.
1110 | @return {Promise}
1111 | */
1112 | 'catch': function _catch(onRejection) {
1113 | return this.then(null, onRejection);
1114 | }
1115 | };
1116 |
1117 | // function polyfill() {
1118 | // var local = undefined;
1119 |
1120 | // if (typeof global !== 'undefined') {
1121 | // local = global;
1122 | // } else if (typeof self !== 'undefined') {
1123 | // local = self;
1124 | // } else {
1125 | // try {
1126 | // local = Function('return this')();
1127 | // } catch (e) {
1128 | // throw new Error('polyfill failed because global object is unavailable in this environment');
1129 | // }
1130 | // }
1131 |
1132 | // var P = local.Promise;
1133 |
1134 | // if (P) {
1135 | // var promiseToString = null;
1136 | // try {
1137 | // promiseToString = Object.prototype.toString.call(P.resolve());
1138 | // } catch (e) {
1139 | // // silently ignored
1140 | // }
1141 |
1142 | // if (promiseToString === '[object Promise]' && !P.cast) {
1143 | // return;
1144 | // }
1145 | // }
1146 |
1147 | // local.Promise = Promise;
1148 | // }
1149 |
1150 | // Strange compat..
1151 | // Promise.polyfill = polyfill;
1152 | Promise.Promise = Promise;
1153 |
1154 | return Promise;
1155 |
1156 | })));
1157 | //# sourceMappingURL=es6-promise.map
--------------------------------------------------------------------------------
/utils/config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | getOpenidUrl: 'https://api.weixin.qq.com/sns/jscode2session',
3 | searchDgUrl: '/118114ng/numSecrity/searchDg.do',
4 | }
--------------------------------------------------------------------------------
/utils/util.js:
--------------------------------------------------------------------------------
1 | function json2Form(json) {
2 | var str = [];
3 | for (var p in json) {
4 | str.push(encodeURIComponent(p) + "=" + encodeURIComponent(json[p]));
5 | }
6 | return str.join("&");
7 | }
8 |
9 | module.exports = {
10 | json2Form: json2Form
11 | }
12 |
13 |
--------------------------------------------------------------------------------
/utils/wxApi.js:
--------------------------------------------------------------------------------
1 | var Promise = require('../plugins/es6-promise.js')
2 |
3 | function wxPromisify(fn) {
4 | return function (obj = {}) {
5 | return new Promise((resolve, reject) => {
6 | obj.success = function (res) {
7 | //成功
8 | resolve(res)
9 | }
10 | obj.fail = function (res) {
11 | //失败
12 | reject(res)
13 | }
14 | fn(obj)
15 | })
16 | }
17 | }
18 | //无论promise对象最后状态如何都会执行
19 | Promise.prototype.finally = function (callback) {
20 | let P = this.constructor;
21 | return this.then(
22 | value => P.resolve(callback()).then(() => value),
23 | reason => P.resolve(callback()).then(() => { throw reason })
24 | );
25 | };
26 | /**
27 | * 微信用户登录,获取code
28 | */
29 | function wxLogin() {
30 | return wxPromisify(wx.login)
31 | }
32 | /**
33 | * 获取微信用户信息
34 | * 注意:须在登录之后调用
35 | */
36 | function wxGetUserInfo() {
37 | return wxPromisify(wx.getUserInfo)
38 | }
39 | /**
40 | * 获取系统信息
41 | */
42 | function wxGetSystemInfo() {
43 | return wxPromisify(wx.getSystemInfo)
44 | }
45 |
46 | /**
47 | * 保留当前页面,跳转到应用内的某个页面
48 | * url:'../index/index'
49 | * params:{key:value1}
50 | */
51 | function wxNavigateTo(url, params) {
52 | var wxNavigateTo = wxPromisify(wx.navigateTo)
53 | const serializedParams = this.paramSerializer(params)
54 | if (serializedParams.length > 0) {
55 | url += ((url.indexOf('?') == -1) ? '?' : '&') + serializedParams
56 | }
57 | return wxNavigateTo({
58 | url: url
59 | })
60 | }
61 | module.exports = {
62 | wxPromisify: wxPromisify,
63 | wxLogin: wxLogin,
64 | wxGetUserInfo: wxGetUserInfo,
65 | wxGetSystemInfo: wxGetSystemInfo
66 | }
67 |
--------------------------------------------------------------------------------
/utils/wxRequest.js:
--------------------------------------------------------------------------------
1 | var Promise = require('../plugins/es6-promise.js')
2 | function wxPromisify(fn) {
3 | return function (obj = {}) {
4 | return new Promise((resolve, reject) => {
5 | obj.success = function (res) {
6 | //成功
7 | resolve(res)
8 | }
9 | obj.fail = function (res) {
10 | //失败
11 | reject(res)
12 | }
13 | fn(obj)
14 | })
15 | }
16 | }
17 | //无论promise对象最后状态如何都会执行
18 | Promise.prototype.finally = function (callback) {
19 | let P = this.constructor;
20 | return this.then(
21 | value => P.resolve(callback()).then(() => value),
22 | reason => P.resolve(callback()).then(() => { throw reason })
23 | );
24 | };
25 | /**
26 | * 微信请求get方法
27 | * url
28 | * data 以对象的格式传入
29 | */
30 | function getRequest(url, data) {
31 | var getRequest = wxPromisify(wx.request)
32 | return getRequest({
33 | url: url,
34 | method: 'GET',
35 | data: data,
36 | header: {
37 | 'Content-Type': 'application/json'
38 | }
39 | })
40 | }
41 |
42 | /**
43 | * 微信请求post方法封装
44 | * url
45 | * data 以对象的格式传入
46 | */
47 | function postRequest(url, data) {
48 | var postRequest = wxPromisify(wx.request)
49 | return postRequest({
50 | url: url,
51 | method: 'POST',
52 | data: data,
53 | header: {
54 | "content-type": "application/x-www-form-urlencoded"
55 | },
56 | })
57 | }
58 |
59 | module.exports = {
60 | postRequest: postRequest,
61 | getRequest: getRequest
62 | }
--------------------------------------------------------------------------------