promiseに基づく.allはwxを実現する.requestマイクロメッセージウィジェット同期要求

3509 ワード

微信小プログラムのwx.requestメソッドは非同期でありajaxのようにasyncの設定パラメータが同期実行を設定していない.しかし、私のところにはこのようなニーズがあります.
var postDataArr = ['aaa','bbb','ccc'];
var getEndData = [];
for(var i = 0;i

wx.requestは非同期リクエストメソッドとして,我々が入手したgetEndDataは依然として空であることは明らかである.
私の解決策はpromiseです.all promiseの概念promiseの役割は簡単に言えばPromiseのその多重チェーン呼び出しであり、階層的なネストコールを避けることができる.最初のajaxリクエストの後、返された結果で再リクエストするとしますか?promiseはとても役に立ちます.
function sendRequest(url, param) {
    return new Promise(function (resolve, reject) {
        request(url, param, resolve, reject);
    });
}

sendRequest('test1.html', '').then(function(data1) {
    console.log('       ,        :', data1);
    return sendRequest('test2.html', data1);
}).then(function(data2) {
    console.log('       ,        :', data2);
    return sendRequest('test3.html', data2);
}).then(function(data3) {
    console.log('       ,        :', data3);
}).catch(function(error) {
    // catch       
    console.log('sorry,      ,       :', error);
});

私が要求したループはこれとは違い、thenが何回必要なのか分かりません.promise.allはどのように実現したのでしょうか.Promise.all(iterable)メソッドは、Promiseパラメータ内のすべてのiterableが「完了(resolved)」またはパラメータにpromiseが含まれていない場合にコールバック完了(resolve)するpromiseインスタンスを返す.パラメータのpromiseに失敗(rejected)がある場合、このインスタンスはコールバックに失敗(reject)し、失敗の原因は最初の失敗promiseの結果である.
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then(function(values) {
  console.log(values);
});

次に、実際のプロジェクト参照のコードを示します.
var PromiseAllArr  = [];//*********************     Promise
 for (var k = 0; k < detail_postData.initData.length; k++) {
      var v = detail_postData.initData[k];
      var data_ = {
        tran_no: v.tran_no,
        info_id: v.infoid
    };
      PromiseAllArr.push(
        new Promise(function (resolve, reject) {
          wx.request({
            url: common.BASE_URL + 'XXXXX',
            data: data_,
            method: 'post',
            dataType: 'json',
            header: {
              'access_token': AUTH_TOKEN,
              'user_key': USER_KEY
            },
            success: function (getinfo) {
               //          
              if (getinfo.data.code == '1') {
                return resolve(getinfo);
              } else {
              //          
                return reject(getinfo.data.msg);
              }
            },
            fail: function (error) {
              return error;
            },
            complete: function (complete) {

              return complete;
            }
          })
      })

      )
  //*********************Promise   ,    
 Promise.all(PromiseAllArr).then(function (values) {
      console.log(values);
    }).catch(reason => {
      console.log(reason)
    });

PromiseAllArrのPromiseリクエストが間違っていると、最初にエラーを報告したPromiseリクエストのrejectが返され、catch関数に戻る.PromiseAllArrのPromiseがすべて正常に要求されるとthen関数に戻り、各Promise要求が正常に返された配列が返されます.
ネット上でasync-waitを使って解決することを提案して、その解決方法その解決原理しかし私はこれを使って比較的に間違いを報告しやすくて、またes 6をes 5に交換する必要があります