​Promise2

简介: ​Promise

all的用法

Promiseall方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。我们仍旧使用上面定义好的runAsync1runAsync2runAsync3这三个函数,看下面的例子:

function runAsync1(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务1执行完成');
            resolve('随便什么数据1');
        }, 1000);
    });
    return p;            
}
function runAsync2(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务2执行完成');
            resolve('随便什么数据2');
        }, 2000);
    });
    return p;            
}
function runAsync3(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务3执行完成');
            resolve('随便什么数据3');
        }, 2000);
    });
    return p;            
}

 

Promise.all([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
    console.log(results);
});

// 输出

异步任务1执行完成

异步任务2执行完成

异步任务3执行完成

["随便什么数据1", "随便什么数据2", "随便什么数据3"]

race的用法

all方法的效果实际上是「谁跑的慢,以谁为准执行回调」,那么相对的就有另一个方法「谁跑的快,以谁为准执行回调」,这就是race方法,这个词本来就是赛跑的意思。race的用法与all一样,我们把上面runAsync1的延时改为1秒来看一下:

function runAsync1(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
            console.log('异步任务1执行完成');
            resolve('随便什么数据1');
    });
    return p;            
}
function runAsync2(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务2执行完成');
            resolve('随便什么数据2');
        }, 2000);
    });
    return p;            
}
function runAsync3(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务3执行完成');
            resolve('随便什么数据3');
        }, 2000);
    });
    return p;            
}
Promise. race ([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
    console.log(results);
});


异步任务1执行完成

VM1213:33 111111 "随便什么数据1"

Promise {<resolved>: undefined}

VM1213:14 异步任务2执行完成

VM1213:24 异步任务3执行完成

promise.all 用法测试

<!--
    promise.all 用法  多操作依次执行完执行下一次操作 Promise.all(promise1,promise2,promise3).then(()=>{}).catch(()=>{})
-->
<template>
    <div>
    </div>
</template>
<script>
  export default {
    data () {
      return {
        dataList: [{}, {}]
      }
    },
    components: {},
    methods: {
      test () {
        const promiseList = this.dataList.map((item) => {
          return this.executePromise(item.origin, options, {
            fileName: item.file,
            action: 'upload'
          })
        })
        // 使用Primise.all来执行promiseList
        Promise.all(promiseList).then(async (res) => {
          if (res.length > 0) {
            res.forEach((item, index) => {
              this.fileInfoArray.push({
                fileName: this.dataList[index].file || '',
                filePath: item.data.url || ''
              })
            })
            console.debug(res)
            if (await this.requestFeedbackUrl()) {
              this.$message('反馈成功!感谢您的建议。', 'success')
            } else {
              this.$message('提交失败!请重试。', 'error')
            }
          }
        }).catch((error) => {
          console.error(error)
          this.fileInfoArray = []
        })
      },
      // 单独的promise
      async executePromise (url, options, info) {
        return new Promise((resolve, reject) => {
          const task = this.upload(url, options, info)  //处理自己的业务
          if (task) {
            const emitter = task.getEmitter()
            emitter.on('progress', function (p) {
            })
            emitter.on('success', function (success) {
              resolve(success)
            })
            emitter.on('error', function (err) {
              reject(err)
            })
          } else {
            reject(new Error('Task Init Error'))
          }
        })
      },
      //执行相关逻辑
      upload () {
      },
      //请求接口
      requestFeedbackUrl () {
      },
    }
  }
</script>
<style lang="less" scoped>
</style>

交流

我是老礼,公众号「进军全栈攻城狮」作者 ,对前端技术保持学习爱好者。我会经常分享自己所学所看的干货,在进阶的路上,共勉!

相关文章
|
10天前
|
数据采集 人工智能 安全
|
5天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
315 164
|
4天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
320 155
|
5天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
361 4
|
12天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
895 6

热门文章

最新文章