如果文章对您有用,请随意打赏。

您的支持将鼓励我做的更好!

不懈探索,简单生活

Nodejs与ES6系列2:Promise对象

2、promise对象

js单线程异步执行的特性,因此在代码中充斥着回调函数。随着回调函数的增加,代码的可读性会愈来愈差,因此引入promise对象是不错的一种选择,可以避免层层回调函数。在ECMA6中提供了原生的promise对象而不再需要第三库。

2.1 promise构造

ECMA6中所提供的promise对象是由构造函数生成的,基本用法如下:

代码 2.1.1

new Promise(function (resolver, reject) {
    if (success)
        resolver(data)
    else
        reject(error)
});

在promise的构造函数中接受(一个带有两个参数的)函数做为入参,两个参数分别是resolver和reject,用于在异步回调中将状态改为成功,或将状态改为失败。代码2.1.2展示promise的简单示例:

var getData = function (data) {
    return new Promise(function (resolver, reject) {
        if (data === -1)
            reject(data);
        setTimeout(resolver([1, 2, 3, 4, 5]), 1);
    })
}

getdata是一个返回promise对象的函数,通过setTimeout来模拟异步操作,当操作成功返回数组[],当输入参数为-1时返回失败状态。代码2.1.3调用getdata函数并返回结果,通过then方法得到成功后回调,而通过catch指定失败后的回调,除了通过catch方法指定失败回调外,还可以通过then方法的第二参数指定失败回调,两种方式等价。

getData(1).then(function (data) {
    console.log(data);
}).catch(function (data) {
    console.log('出现异常:'+data);
})
====
[ -1, 2, 3, 4, 5 ]

2.2、promise.all

很多业务场景需要对数据进行集合操作,例如发送数据取出一个集合数据,遍历集合数据将集合数据又发送至另一个接口取数据,这是一个典型的二次调用接口方法,此时就需要使用到promise.all 方法。

// return 集合
var getData = function (data) {
    return new Promise(function (resolver, reject) {
        if (data === -1)
            reject(data);
        setTimeout(resolver([-1, 2, 3, 4, 5]), 1);
    })
}


var getdataInfo = function (data) {
    return new Promise(function (resolver, reject) {
        if (data === -1)
            reject(data);
        console.log(data + '的详情是...');
        setTimeout(resolver(data), 1);
    })
}

getData(1).then(function (data) {
    var array = data.map(getdataInfo);
    Promise.all(array).then(function (data) {
        console.log('全部请求成功');
    }).catch(function (data) {
        console.log('数据' + data + '失败');
    });
})

getdata函数返回一个集合,集合中的数据作为getdatainfo的函数的参数,而datainfo函数也是一个异步操作,首先通过数组map方法生成promise对象的数组,然后调用promise.all(array)调用promise数组,当整个promise都返回时触发promise.all的then方法,当其中一个失败的时候触发catch方法。

posted @   帅虫哥  阅读(1295)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示