微信小程序promsie.all和promise顺序执行

微信小程序promsie.all和promise顺序执行

一、前言

最近在做小程序的开发,碰到的一个需求就是表单提交,提交的表单中包含有图片,微信这边的做法是先上传图片,后台把图片名称和地址返回给你,然后你把图片信息插入到表单的相应位置再提交表单,这里就涉及到如何上传完图片的请求再上传表单,而且微信小程序里面如果图片是多个的话,也只能一张张上传。简单来说就是上传完图片(多个请求),拿到返回值,再上传表单,该如何做?

二、Promise.all和Promise.race

先来介绍Promise.all和Promise.race方法的不同点Promise.all(iterable) 方法指当所有在可迭代参数中的 promises 已完成,或者第一个传递的 promise(指 reject)失败时,返回 promise。iterable为可迭代对象,但是一般为数组。返回值也是一个Promise对象。

需要明确的几点,Promise.all是并发执行的同时运行多个Promise对象,而且返回的Promise对象的参数是一个数组,数组中的各项也是可迭代对象执行的顺序返回。

Promise.race(iterable) 方法返回一个新的 promise,参数iterable中只要有一个promise对象”完成(resolve)”或”失败(reject)”,新的promise就会立刻”完成(resolve)”或者”失败(reject)”,并获得之前那个promise对象的返回值或者错误原因。所以只要iterable中有一个完成或者失败就立即返回一个promise对象。根据race这个单词为赛跑也能得出,最先到达的立即返回一个promise对象。

根据上面的定义,我们采用的Promise.all方法来完成我们的需求。

//存储promise对象的数组
let promiseArr = [];
//图片地址数组
let imageList = [];
//将图片地址的上传的promise对象加入到promiseArr
for (let i = 0; i < imageList.length; i++) {
  let promise = new Promise((resolve, reject) => {
    //微信图片上传
    wx.uploadFile({
      url: 'https://xxx.xxx.xxx/api/uploadImage',
      filePath: imageList[i],
      name: 'file',
      success: function(res) {
        //可以对res进行处理,然后resolve返回
        resolve(res);
      },
      fail: function (error) {
        reject(error);
      },
      complete: function (res) {
      },
    })
  });
  promiseArr.push(promise)
}
//Promise.all处理promiseArr数组中的每一个promise对象
Promise.all(promiseArr).then((result) => {
  //对返回的result数组进行处理
})

三、微信小程序的问题

在做微信小程序的图片上传功能,这边只能先上传图片,然后将图片名和地址以response返回。

这里面我们就是用了promise.all方法但是有一个问题就是,promise.all是并发执行的,但是微信小程序一次只能并发10个请求。

对于图片上传,可能需要一次上传超过10张图片,也就是一次并发超过10个请求,这样的话微信就会报错

“WAService.js:4 uploadFile:fail createUploadTask:fail exceed max upload connection count 10”。

四、顺序Promise执行处理

因为Promise.all是同时运行多个promsie对象,所以对于这种并发的数量,小程序是有限制的,一次只能并发10个,所以如果想突破这种限制,可以进行顺序执行每个Promise。

代码如下:

 

//顺序处理函数
function sequenceTasks(tasks) {
  //记录返回值
  function recordValue(results, value) {
    results.push(value);
    return results;
  }
  let pushValue = recordValue.bind(null, []);
  let promise = Promise.resolve();
  // 处理tasks数组中的每个函数对象
  for (let i = 0; i < tasks.length; i++) {
    let task = tasks[i];
    promise = promise.then(task).then(pushValue);
  }
  return promise;
}
 
//函数数组,每个函数的返回值是一个promise对象
let promiseFuncArr = [];
//图片地址数组
let imageList = [];
//将图片地址的上传的函数加入到promiseFuncArr数组中
for (let i = 0; i < imageList.length; i++) {
  let promiseTemp = function(){
    return new Promise((resolve, reject) => {
      //微信图片上传
      wx.uploadFile({
        url: 'https://xxx.xxx.xxx/api/uploadImage',
        filePath: imageList[i],
        name: 'file',
        success: function(res) {
          //可以对res进行处理,然后resolve返回
          resolve(res);
        },
        fail: function (error) {
          reject(error);
        },
        complete: function (res) {
        },
      })
    });
  };
  promiseFuncArr.push(promiseTemp)
}
 
sequenceTasks(promiseFuncArr).then((result) => {
  //对返回的result数组进行处理
});

1.这里解释一下sequenceTasks函数的作用

首先recordValue函数传入两个值,一个是results是返回的数组,另一个是value,value是传入的值,results.push(value);将每一个值push到results数组,然后再返回results数组。

?

1

let pushValue = recordValue.bind(null, []);

pushValue也是一个函数对象,将recordValue bind到一个[ ]数组中,第一个参数传null代表,不改变函数this的指向,所以pushValue得到就是一个function (value)的函数,参数传入value。

?

1

promise = promise.then(task).then(pushValue);

task是函数,函数返回promise对象,在我们这里就是上传图片函数,每一张图片上传都创建一个函数,then(pushValue),pushValue是function (value)的函数,value代表的就是图片上传之后的返回值,pushValue将返回值push到result数组中,依次执行,依次加入到result数组中,最后返回。就可以得到一个对象数组,数组中就是依次执行返回的结果。

2. sequenceTasks也里面的for循环,也可以写成如下的reduce方式:

function sequenceTasks(tasks) {
  //记录返回值
  function recordValue(results, value) {
    results.push(value);
    return results;
  }
  let pushValue = recordValue.bind(null, []);
  return tasks.reduce(function (promise, task) {
    return promise.then(task).then(pushValue);
  }, Promise.resolve());
}

 

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 微信小程序模版合集下载包含了160个微信小程序源码.zip和35个行业-微信小程序源码.zip。这些模板可以帮助开发者快速开发小程序,省去不必要的时间和精力。 在160个微信小程序源码.zip中,包含了各种类型的小程序模板,比如美食、酒店、外卖、婚礼、房产、教育等,开发者可以根据自己的需求选择合适的模板进行二次开发。这些模板已经包含了基本的功能和页面,例如登录、注册、商品展示、订单管理等,开发者只需要将自己的数据和逻辑接入即可。 35个行业-微信小程序源码.zip则是更加针对性的模板,专门为某些行业或者特定领域设计的小程序模板。比如医院、汽车、健身、商城等,这些模板已经适配了相应行业的需求和特点,包含了更多的功能和页面,可以直接拿来使用或者进行修改。 总之,微信小程序模版合集下载是非常有用且方便的资源。对于小程序开发者来说,这些模板可以节省很多时间和精力,让开发更加高效和轻松。同时,这些模板也可以作为学习的参考,对初学者有很大的帮助。 ### 回答2: 微信小程序已成为越来越多企业和个人的选择,为这些用户提供方便、实用的微信小程序源码,能大大缩短开发时间,降低开发成本。本次提供的微信小程序模版合集下载包含 160 个微信小程序源码,涵盖多种类型的小程序,包括商城、社交、新闻资讯、工具等等。另外,35 个行业-微信小程序源码.zip 包含各类小程序,针对不同的行业开发,如美食、旅游、教育等等。这些小程序源码具有良好的交互性、个性化定制功能、良好的用户体验,且可快速部署上线,极大地提高了开发效率和部署速度。如果您正在开发微信小程序,那么这些源码就是不可多得的帮手,它将为您尽可能地节省时间和精力。同时,这些源码支持二次开发和定制,您可根据自己的需求进行修改和扩展,并快速上线。如果您有任何问题和需求,可以随时联系我们,我们将为您提供实时帮助和技术支持。 ### 回答3: 微信小程序模版合集下载是一种非常方便的服务,它能够方便用户下载不同种类的微信小程序模版。本次提供的微信小程序模版合集包括160个微信小程序源码和35个行业-微信小程序源码。这些源码涵盖了不同行业的微信小程序,用户可以根据自己的需求选择相应的模版并进行定制。 160个微信小程序源码.zip中包括了各类微信小程序,比如电商、社交、餐饮、教育、医疗等,这些模版的设计风格及功能设置均有所不同,用户可以根据自己的需求选择相应的模版并进行二次开发。 35个行业-微信小程序源码.zip中包含了不同行业的微信小程序,比如旅游、汽车、电子商务、婚庆、美容等,这些模版中所包含的信息、功能及呈现方式都是与其所在行业相关的,可以让用户更好地进行定制和二次开发。 总之,微信小程序模版合集下载为微信小程序的开发提供了便利,开发者可以根据自己的需求选择相应的模版并进行二次开发,从而快速构建微信小程序。同时,这些模版也为其他用户提供了更为丰富的微信小程序,能够更好地满足用户的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值