promsie.all和promise顺序执行详解

本文主要介绍了微信小程序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对象加入到promiseArrfor (let i = 0; i  {    //微信图片上传    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”。

promsie.all和promise顺序执行详解

四、顺序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  {      //微信图片上传      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数组。

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

登录后复制

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

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());}

登录后复制

相关推荐:

headjs实现网站并行加载但顺序执行JS

Java中类的加载顺序执行结果详细介绍

JS的代码执行有哪些先后顺序

以上就是promsie.all和promise顺序执行详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2790227.html

(0)
上一篇 2025年3月8日 18:53:06
下一篇 2025年3月8日 18:53:12

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • jQuery实现与GridView类似的功能实例

    本文主要和大家分享jquery实现一个类似gridview的编辑,更新,取消和删除的功能,在项目中遇到这样的需求当用户点击编辑时,在点击行下动态产生一行,编辑铵钮变为disabled,新产生的一行有更新和取消的铵钮,点击“取消”铵钮,删除刚…

    2025年3月8日 编程技术
    200
  • jQuery的Promise如何正确使用

    关于jquery的promise的使用方法,大家了解多少?本文就主要和大家分享jquery的promise如何正确使用,希望能帮助到大家。 先前了解了ES6的Promise对象,来看看jQuery中的Promise,也就是jQuery的De…

    2025年3月8日
    200
  • ES6中Promise代码实例分析

    本文主要和大家分享es6中promise代码实例分析,希望大家更更好掌握promise的用法,感兴趣的朋友参考下吧,希望能帮助到大家。 废话不多说了,直接给大家贴代码了,具体如下所示: nbsp;html>    var a=0var…

    编程技术 2025年3月8日
    200
  • JavaScript之读取和写入cookie实现方法

    本文我们先了解一下cookie,然后再和大家分享javascript之读取和写入cookie实现方法,希望能帮助到大家。 首先先让我们简单地了解一下cookie.  在我们制作网页的过程中,经常需要把信息从一个页面传递给另一个页面,这时候就…

    2025年3月8日 编程技术
    200
  • vue实现记住密码到cookie的方法

    大体思路就是通过存/取/删cookie实现的;每次进入登录页,先去读取cookie,如果浏览器的cookie中有账号信息,就自动填充到登录框中,存cookie是在登录成功之后,判断当前用户是否勾选了记住密码,如果勾选了,则把账号信息存到co…

    2025年3月8日
    200
  • react-native中ListView组件点击跳转实现方法

    本文主要给大家介绍了关于react-native中listview组件点击跳转的相关资料,listview作为react native的核心组件,用于高效地显示一个可以垂直滚动的变化的数据列表。需要的朋友可以参考借鉴,下面来一起看看吧。 先…

    2025年3月8日
    200
  • JavaScript读取和写入cookie实例教程

    本文主要给大家通过实例讲述了javascript读取和写入cookie的相关知识点,有这方面需要的朋友参考下吧,希望能帮助到大家。 首先先让我们简单地了解一下cookie. 在我们制作网页的过程中,经常需要把信息从一个页面传递给另一个页面,…

    2025年3月8日 编程技术
    200
  • ES6 Promise 扩展always方法实例详解

    本文主要介绍es6 promise 扩展always方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 ES6添加了Promise对象,成功时在then中处理,失败则在catch中处理,但有…

    编程技术 2025年3月8日
    200
  • js中promise实例解析

    大家都知道nodejs很快,为什么会这么快呢,原因就是node采用异步回调的方式来处理需要等待的事件,使得代码会继续往下执行不用在某个地方等待着。但是也有一个不好的地方,当我们有很多回调的时候,比如这个回调执行完需要去执行下个回调,然后接着…

    2025年3月8日
    200
  • jQuery实现可兼容IE6的滚动监听功能_jquery

    本文主要和大家介绍jquery实现可兼容ie6的滚动监听功能,结合实例形式分析了jquery针对不同浏览器的事件监听、响应及页面属性动态变换相关实现技巧,需要的朋友可以参考下,希望能帮助到大家。 其实这东西本打算用原生的javascript…

    2025年3月8日
    200

发表回复

登录后才能评论