小程序模板网

扩展微信小程序框架功能:Promise

ES6 对 Promise 有了原生的支持,但微信开发者工具更新版本(0.11.112200)后, 移除了开发者工具对 ES6 中 Promise 特性原生的支持, 理由是因为实体机器是不支持 Promise 的, 所以需要引入第三方的 Promise 库。

Promise

Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。

Promise对象有以下两个特点:

  • 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称Fulfilled)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

  • 一旦状态改变,就不会再变,任何时候都可以得到这个结果。 Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过它,再去监听,是得不到结果的。

有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。Promise也有一些缺点。首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

es-promise

es6-promise 是一个兼容 ES6 Promises 的Polyfill类库。 它基于 RSVP.js 这个兼容 Promises/A+ 的类库, 它只是 RSVP.js 的一个子集,只实现了Promises 规定的 API。

基本用法

创建Promise对象

    new Promise(function(resolve) {
        reslove(42);
    })
    function helloWorld(ready) {        return new Promise(function(resolve, reject) {            if (ready) {
                resolve("Hello World!");
            } else {
                reject("Good bye!");
            }
        });
    }
    helloWorld(true).then(function(message) {        console.log(message);
    }, function(error) {        console.log("Error:", error);
    }); // 输出:  Hello World!
    helloWorld(false).then(function(message) {        console.log(message);
    }, function(error) {        console.log("Error:", error);
    }); // 输出:  Error: Good bye!

以上代码,helloWord 函数接受一个参数,如果为true输出”Hello World!”,如果为false就输出错误的信息。helloWord 函数返回的是一个 Promise 对象。resolve 方法可以使 Promise 对象的状态改变成成功,同时传递一个参数用于后续成功后的操作。reject 方法则是将 Promise 对象的状态改变为失败,同时将错误的信息传递到后续错误处理的操作。

每一个 Promise 都有一个 .then 方法,这个方法接受两个参数,第一个是处理 resolved 状态的回调,一个是处理 rejected 状态的回调

Promise.all 可以接收一个元素为 Promise 对象的数组作为参数,当这个数组里面所有的 Promise 对象都变为 resolve 时,该方法才会返回。

    var p1 = new Promise(function(resolve) {
        setTimeout(function() {
            resolve("Hello");
        }, 3000);
    });    var p2 = new Promise(function(resolve) {
        setTimeout(function() {
            resolve("World");
        }, 1000);
    });

    Promise.all([p1, p2]).then(function(result) {        console.log(result); // 输出: ["Hello", "World"]
    });

以上代码,模拟了传输两个数据需要不同的时长,虽然 p2 的速度比 p1 要快,但是 Promise.all 方法会按照数组里面的顺序将结果返回。

其他



易优小程序(企业版)+灵活api+前后代码开源 码云仓库:starfork
本文地址:https://www.eyoucms.com/wxmini/doc/course/23397.html 复制链接 如需定制请联系易优客服咨询:800182392 点击咨询
QQ在线咨询