promise使用场景

摘要:
arr.forEach使用img的load事件获取图片宽高其实是异步操作。查看大图效果出现的js代码this.$preview.open。在执行这一步时this.imgInfoArr上面图片异步获取宽高必须全部执行完成。所以需要使用到promise。

1、使用场景:在一个房源列表里,点击某一条房源里的图片实现看大图效果。(vue2)

问题:使用vue-preview查看大图时需要知道图片宽高,但是接口没有返回,所以需要使用Image对象来获取图片宽高。

 arr.forEach((val, indexs) =>{
    let img = newImage()
    img.addEventListener('load', () =>{
       _this.imgInfoArr.push({
          src: val,
          w: img.width,
           h: img.height
        })
         if (arr.length - 1 ===indexs) {
            resolve()
         }
      })
       img.src =val
  })    

使用img的load事件获取图片宽高其实是异步操作。

查看大图效果出现的js代码

this.$preview.open(index, this.imgInfoArr)。
在执行这一步时this.imgInfoArr上面图片异步获取宽高必须全部执行完成。所以需要使用到promise。完整代码如下:
//看大图
watchBigImg(index, arr) {
      var _this = this
      functiongetImgInfo() {
        var p = new Promise(function(resolve, reject) {
          _this.imgInfoArr =[]
          arr.forEach((val, indexs) =>{
            let img = newImage()
            img.addEventListener('load', () =>{
              _this.imgInfoArr.push({
                src: val,
                w: img.width,
                h: img.height
              })
              if (arr.length - 1 ===indexs) {
                resolve()
              }
            })
            img.src =val
          })
        })
        returnp
      }
      getImgInfo()
        .then((data) =>{
          this.$preview.open(index, this.imgInfoArr)
        })
    }

以下代码保证了是所有图片都遍历完成获取到宽高push到this.imgInfoArr里面去。

if (arr.length - 1 ===indexs) {
   resolve()
}

2、封装小程序调用请求方法

ajax(url,method,data){       
        let pData=data
        pData.method=method
        let getSuccessMethod= function(method) {
            let str_tempmethod = method.substring(method.indexOf(".") + 1);
            str_tempmethod = str_tempmethod.replace(/./g, "_");
            str_tempmethod += "_response";
            returnstr_tempmethod;
        }
        let myFirstPromise = new Promise((resolve, reject) =>{
            swan.request({
                url:url,
                data:pData,
                success: res =>{
                    resolve(res.data[getSuccessMethod(method)])
                },
                fail: err =>{
                    console.log('request fail', err);
                    reject(err)
                },
                complete: () =>{
                    //this.setData('loading', false);
}
            });
        });
        returnmyFirstPromise        
    }

免责声明:文章转载自《promise使用场景》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇flume使用之httpSourcecrypto-js遇到的坑下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

nodeJS从入门到进阶一(基础部分)

一、Node.js基础知识 1、概念 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是JavaScript的运行环境 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。 2、安装使用 官网下载地址:http://nodejs.cn/ nodeJS5个基本对象: 1、require 引...

promise错误处理的三种方法

promise碰到then,也就是resolve或者reject的时候是异步的,所以try...catch对它是没有用的 1、then(resolve,reject); then方法中第二个回调,是失败时候做的失败时候做的事 functionf(val){ return new Promise((r...

Promise.resolve解析

总结自:https://blog.csdn.net/lq15310444798/article/details/81275278 Promise.resolve返回一个Promise实例 参数分4种情况: 1.参数为Promise实例 返回此实例 可能执行catch ---------------------------------------------...

javascript ES6 新特性之 Promise,ES7 async / await

es6 一经推出,Promise 就一直被大家所关注。那么,为什么 Promise 会被大家这样关注呢?答案很简单,Promise 优化了回调函数的用法,让原本需要纵向一层一层嵌套的回调函数实现了横向的调用,也就是链式调用。 我们先来看下面的代码: 1 function getData(){ 2 setTimeout(()=>{ 3...

关于Promise,你必须知道的几点。

1.如何改变promise的状态 1). resolve(value) 如果当前的状态是pedding 就会改为 resolved 2). reject(reason) 如果当前状态是pedding 就会改为 rejected 2.一个promise指定多个成功 / 失败的回调,都会调用吗? 当promise状态改变时,对应的回调函数都会调用 const...

Promise 对象

Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从...