js promise

前提

用webview 做app开发。中间遇到图片上传的问题,上传过程展示上传进度。

原来的思路是for 循环,创建异步上传。但是在做的过程中发现,会出现上传展示会出现 1/20 一下子就到了 7/20 然后 15/20 最后完成的现象。我觉得可能是 浏览器会一次性执行好几个请求,导致速度不均衡。所以我希望可以让一个请求完成,在进行另一个请求。

虽然有普通的方法可以实现这个过程。但是还是学到了一个新的方法来做这样的操作就是 承诺 promise

阮大神的解释

Promises对象

Promises对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。

简单说,它的思想是,每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数。比如,f1的回调函数f2,可以写成:

f1().then(f2);

  
f1要进行如下改写(这里使用的是jQuery的实现):

  function f1(){
    var dfd = $.Deferred();
    setTimeout(function () {
      // f1的任务代码
      dfd.resolve();
    }, 500);
    return dfd.promise;
  }

  
这样写的优点在于,回调函数变成了链式写法,程序的流程可以看得很清楚,而且有一整套的配套方法,可以实现许多强大的功能。

比如,指定多个回调函数:

f1().then(f2).then(f3);

  
再比如,指定发生错误时的回调函数:

f1().then(f2).fail(f3);

  
而且,它还有一个前面三种方法都没有的好处:如果一个任务已经完成,再添加回调函数,该回调函数会立即执行。所以,你不用担心是否错过了某个事件或信号

。这种方法的缺点就是编写和理解,都相对比较难。

代码 一张一张上传图片,一张加载完成,另一张开始加载。

function RenderSelectPhoto() {
    renderDomImg().then(function() {
        P.fileIndexImg++;
        RenderSelectPhoto();
    })
}
function renderDomImg() {
    return new Promise(function(resolve, reject) {
        var FilesLeng=getPropertyCount(P.Files);
        var file=P.Files[P.fileIndexImg];
        var image = document.createElement("img");
        image.file = file;
        var reader = new FileReader();
        var ret = reader.readAsDataURL(file);
        reader.onload = (function(aImg){
            return function(e){
                var img = new Image();
                img.src = e.target.result;
                var canvas = document.createElement("canvas");
                canvas.width="300";
                canvas.height="300";
                ctx = canvas.getContext("2d");
                img.onload= function(){
                    ctx.fillRect(0,0,300,300);
                    ctx.drawImage(img,0,0,300,300);
                    var  _canvas = canvas.toDataURL("image/jpeg", 0.5);
                    $("#index" + photoclass).attr("src",_canvas);
                    setTimeout(function(){
                        resolve();//这里 开始下一次循环
                    },200)
                }
            };
        }(image));
    })
}
### JavaScript 中 Promise 的用法与示例 #### 什么是 PromisePromise 是一种用于处理异步操作的对象,它表示一个最终会完成或者失败的操作的结果。通过使用 Promise,可以更清晰地管理复杂的异步流程。 #### 基本结构 Promise 对象有三种状态:`pending`(等待)、`fulfilled`(已成功)和 `rejected`(已失败)。当 Promise 被执行时,其状态会从 `pending` 变为 `fulfilled` 或者 `rejected`[^1]。 以下是基本语法: ```javascript const myPromise = new Promise((resolve, reject) => { // 异步操作逻辑 if (/* 条件 */) { resolve(value); // 成功时调用 } else { reject(error); // 失败时调用 } }); ``` #### 使用 `.then()` 和 `.catch()` `.then()` 方法用于处理成功的回调,而 `.catch()` 则捕获错误并提供相应的处理机制。 ```javascript myPromise .then(result => console.log(`Success: ${result}`)) // 处理成功的情况 .catch(error => console.error(`Error: ${error.message}`)); // 处理失败的情况 ``` #### 链式调用 由于返回的是一个新的 Promise 实例,因此可以通过链式调用来简化多个异步操作的顺序执行。 ```javascript new Promise(resolve => setTimeout(() => resolve(1), 1000)) .then(val => val * 2) .then(val => val + ' is the result') .then(console.log); // 输出:"2 is the result" ``` #### 并行执行多个 Promise 如果需要同时启动多个异步任务,则可以使用 `Promise.all([])` 方法来等待所有的 Promise 完成后再继续下一步。 ```javascript Promise.all([ fetch('/api/data1').then(response => response.json()), fetch('/api/data2').then(response => response.json()) ]) .then(([data1, data2]) => { console.log(data1, data2); }) .catch(err => console.error('An error occurred:', err)); ``` #### 错误处理的最佳实践 为了更好地控制异常传播路径,在设计复杂的应用程序时应始终考虑如何优雅地处理潜在的错误情况。 ```javascript function fetchData(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onload = () => (xhr.status === 200 ? resolve(xhr.responseText) : reject(new Error('Failed'))); xhr.onerror = () => reject(new Error('Network Error')); xhr.send(); }); } fetchData('/some/valid/url') .then(data => JSON.parse(data)) .then(processedData => console.log(processedData)) .catch(e => alert(e.message)); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值