1 文由

某项目的需求:先要请求API1,再以API1的结果请求API2.

var n, a;
//var r = window.md5;
var r = function (password, username) {
return new Promise((resolve, reject) => {
// 校验 获得 salt
var saltUrl = "/wydaas/gateUser/noCheck/inner-user/salt.json"; // http://xx.yy.zz.kk:8080/wydaas/gateUser/noCheck/inner-user/salt.json
var postData = { userName: username };
//saltUrl += "?userName="+username;
//var postData = null;
console.log(postData);
t.$http.post(saltUrl, postData).then((function(e) {
var n = e.data.data;
console.log("e:");
console.log(e);
var salt = e.body.data.data; // response 的 js json 对象
var text = password+"{"+salt+"}";
console.log(text);
console.log(sha256_digest(text));
resolve(sha256_digest(text));
/*
var n = e.data.data;
n.status ? (t.$message({
type: "success",
message: n.message || t.i18n.message.OPERATION_COMPLETE
}),
t.loginData.show = !1,
t.setCookieFun(),
t.$router.replace({
path: "/catalog"
}),
window.location.reload()) : (t.$alert(n.message || t.i18n.message.OPERATION_ERROR, t.i18n.message.SYSTEM_TXT, {
closeOnClickModal: !1,
confirmButtonText: t.i18n.message.OK,
type: "error"
}),
t.delCookie("accountInfo")),
t.saveLoading = !1 */
}
)).catch((function(e) {
this.saveLoading = !1;
reject(e);
}
))
})
}; "0" === t.loginType && (
r(t.formData.userPassword, t.formData.userName).then(res => {
console.log("res:" + res);
n = "/wydaas/gateUser/noCheck/loginInner.json",
a = {
userName: t.formData.userName,
//pwd: r(t.formData.userPassword, t.formData.userName)
pwd: res
}, console.log("a:"),
console.log(a), t.$http.post(n, a).then((function(e) {
var n = e.data.data;
n.status ? (t.$message({
type: "success",
message: n.message || t.i18n.message.OPERATION_COMPLETE
}),
t.loginData.show = !1,
t.setCookieFun(),
t.$router.replace({
path: "/catalog"
}),
window.location.reload()) : (t.$alert(n.message || t.i18n.message.OPERATION_ERROR, t.i18n.message.SYSTEM_TXT, {
closeOnClickModal: !1,
confirmButtonText: t.i18n.message.OK,
type: "error"
}),
t.delCookie("accountInfo")),
t.saveLoading = !1
}
)).catch((function() {
this.saveLoading = !1
}
)) })
)

2 Promise 简介

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

它最早由社区提出并实现,ES6将其写进了语言标准,统一了用法,并原生提供了Promise对象。

特点

  • promise是一个对象

JS中,对象函数的区别就是对象可以保存状态,函数不可以(闭包除外)

  • 摆脱层层链式callback;代码易于理解和维护。并未剥夺函数return的能力,因此无需层层传递callback,进行回调获取数据

  • 多个异步等待合并便于解决

  • 【状态变更的响应处理:then】当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;

  • 【状态变更的不可变更性】但promise状态一经改变,不会再变。

3 Promise 详解

样例/格式

new Promise(
function (resolve, reject) {
// 一段耗时的异步操作
resolve('成功') // 数据处理完成
// reject('失败') // 数据处理出错
}
).then(
(res) => {console.log(res)}, // 成功
(err) => {console.log(err)} // 失败
)
var funcA = function (a, b) {
return new Promise(function (resolve, reject) {
// 一段耗时的异步操作
console.log(a, b);
resolve('成功') // 数据处理完成
// reject('失败') // 数据处理出错
});
} var b = funcA("123", "456").then(
(res) => {console.log(res)}, // 成功
(err) => {console.log(err)} // 失败
)
var funcA = function (a, b) {
//to do some things
console.log(a+b);
return new Promise( (resolve, reject) => {
//to do some things 例如:一段耗时的异步操作
console.log(a, b);
resolve('成功') // 数据处理完成
// reject('失败') // 数据处理出错
});
} var b = funcA("123", "456").then(
(res) => {console.log(res)}, // 成功
(err) => {console.log(err)} // 失败
)

2类状态变更的处理: resolve / reject

  • 一旦状态改变就不会再变 (两种状态改变:成功或失败)

    • Pending(进行中) -> Fulfilled(已成功)
    • Pending(进行中) -> Rejected(已失败)
  • resolve

作用: 将Promise对象的状态从“未完成(pending)”变为“成功(resolved)”。

在异步操作成功时调用,并将异步操作的成功结果作为参数传递出去;

  • reject

作用:将Promise对象的状态从“未完成(pending)”变为“失败(rejected)

在异步操作失败时调用,并将异步操作报出的错误信息作为参数传递出去。

Promise对象的3个状态

  • 对象的状态不受外界影响 (3种状态)

    • Pending 状态(进行中)
    • Fulfilled 状态(已成功)
    • Rejected 状态(已失败)

then

Promise实例/对象生成后,可用then方法分别指定两种状态变更处理(resolve/reject)的回调参数。then 方法可以接受两个回调函数作为参数:

  • Promise对象状态改为Resolved时调用 (必选)
  • Promise对象状态改为Rejected时调用 (可选)
function sleep(ms) {
return new Promise(function(resolve, reject) {
setTimeout(resolve, ms);
})
} sleep(500).then( ()=> console.log("finished"));

这段代码定义了一个函数sleep,调用后,等待了指定参数(500)毫秒后执行then中的函数。值得注意的是,Promise新建后就会立即执行。

执行顺序

接下来我们探究一下它的执行顺序,看以下代码:

let promise = new Promise(function(resolve, reject){
console.log("AAA");
resolve()
});
promise.then(() => console.log("BBB"));
console.log("CCC") // AAA
// CCC
// BBB

执行后,我们发现输出顺序总是 AAA -> CCC -> BBB

表明:在Promise新建后会立即执行,所以首先输出 AAA。然后,then方法指定的回调函数将在当前脚本所有同步任务执行完后才会执行,所以BBB 最后输出。

4 示例

示例1:最简单示例

new Promise(resolve => {
setTimeout(() => {
resolve('hello')
}, 2000)
}).then(res => {
console.log(res)
})

示例2: 分两次,顺序执行

new Promise(resolve => {
setTimeout(() => {
resolve('hello')
}, 2000)
}).then(val => {
console.log(val) // 参数val = 'hello'
return new Promise(resolve => {
setTimeout(() => {
resolve('world')
}, 2000)
})
}).then(val => {
console.log(val) // 参数val = 'world'
})

示例3:promise完成后then()

let pro = new Promise(resolve => {
setTimeout(() => {
resolve('hello world')
}, 2000)
}); setTimeout(() => {
pro.then(value => {
console.log(value) // hello world
})
}, 2000);

结论:promise作为队列最为重要的特性,我们在任何一个地方生成了一个promise队列之后,我们可以把他作为一个变量传递到其他地方。

X 参考文献

[JavaScript]Promise:异步编程的更多相关文章

  1. 学习Promise异步编程

    JavaScript引擎建立在单线程事件循环的概念上.单线程( Single-threaded )意味着同一时刻只能执行一段代码.所以引擎无须留意那些"可能"运行的代码.代码会被放 ...

  2. JavaScript入门⑨-异步编程●异世界之旅

    JavaScript入门系列目录 JavaScript入门①-基础知识筑基 JavaScript入门②-函数(1)基础{浅出} JavaScript入门③-函数(2)原理{深入}执行上下文 JavaS ...

  3. ES6笔记(7)-- Promise异步编程

    系列文章 -- ES6笔记系列 很久很久以前,在做Node.js聊天室,使用MongoDB数据服务的时候就遇到了多重回调嵌套导致代码混乱的问题. JS异步编程有利有弊,Promise的出现,改善了这一 ...

  4. javascript的异步编程

    同步与异步 介绍异步之前,回顾一下,所谓同步编程,就是计算机一行一行按顺序依次执行代码,当前代码任务耗时执行会阻塞后续代码的执行. 同步编程,即是一种典型的请求-响应模型,当请求调用一个函数或方法后, ...

  5. JavaScript中异步编程

    一 关于事件的异步 事件是JavaScript中最重要的一个特征,nodejs就是利用js这一异步而设计出来的.所以这里讲一下事件机制. 在一个js文件中,如果要运行某一个函数,有2中手段,一个就是直 ...

  6. promise异步编程的原理

    一.起源 JavaScript中的异步由来已久,不论是定时函数,事件处理函数还是ajax异步加载都是异步编程的一种形式,我们现在以nodejs中异步读取文件为例来编写一个传统意义的异步函数: var ...

  7. 说一说javascript的异步编程

    众所周知javascript是单线程的,它的设计之初是为浏览器设计的GUI编程语言,GUI编程的特性之一是保证UI线程一定不能阻塞,否则体验不佳,甚至界面卡死. 所谓的单线程就是一次只能完成一个任务, ...

  8. javascript的异步编程方法

    一,callback 回调函数 即函数f1和函数f2的关系是f1(f2()); f2作为f1()的回调函数,在f1执行过程中就开始执行f2,先执行线程的主要逻辑,将比较耗时的任务放在后面执行. 回调函 ...

  9. async/await actor promise 异步编程

    Python协程:从yield/send到async/await http://blog.guoyb.com/2016/07/03/python-coroutine/ Async/Await替代Pro ...

  10. Promise异步编程解决方案

    Promise是ES6中新增的异步编程解决方案,体现在代码中它是一个对象,可以通过 Promise 构造函数来实例化. 其最基本的使用 new Promise(function(resolve,rej ...

随机推荐

  1. sqlite3 replace函数服务器端替换一个字段中数据的例子 ;拼接字段字符串

    1.把字段filePath中所有类似 '/usr/local/Trolltech/%'的字符串都替换成   '/zzzzz/' update   EstDlpFileAttribute  set    ...

  2. angular-gridster2使用

    1.安装:npm install angular-gridster2 --save 2.引入 3.html代码 <div id="fullscreen" style=&quo ...

  3. centos 挂载共享目录

    共享目录://10.253.47.102/share/文件传递暂用 将共享路径挂载到centos /etc/fstab  添加一行配置,mount -a 生效

  4. eclipse静态资源保存不重启(热部署静态资源/html)

    简单的来说就是windows->Prefrence->搜索 build automatically 并勾选就可以 不同的版本设置选项可能略微不同,其实比较简单但是新手可能不好找,所以帮到的 ...

  5. POJ3723 Conscription 题解

    start: 2021-08-04 16:56:50 题目链接: http://poj.org/problem?id=3723 题目内容: Description Windy has a countr ...

  6. jmeter 变量的使用

    jmeter添加变量 一.添加用户自定义变量 添加用户自定义变量 作用:常用数据参数化.当变量发生变化时,不需要逐个脚本修改,只需要修改用户自定义中的变量就可以了. 变量使用如下图 二.函数助手定义变 ...

  7. Crypto入门 (十一)easychallenge

    前言: 这题跟python有关,可见看懂python代码还是很有必要得,需要有一些python基础才好 easychallenge: 题目: 下载后来发现是一个.pyc为后缀得文件,查找资料可知,该文 ...

  8. 在POD的ENV中添加POD的信息

    主要用到的参数: - name POD_NAME volumeFrom: fieldRef: fieldPath:   metadata.name - name: POD_IP volumeFrom: ...

  9. docker安装配置gitlab时的常用命令整理

    1.下载安装dockerapt install docker.io2.服务启动service docker start 3.拉取gitlabdocker pull beginor/gitlab-ce: ...

  10. AssetBuddle(一)

    一·含义 一个压缩文件,针对于特定平台的资产压缩包.资产包括模型,贴图,预制体,音效,材质球等,注意不包括c#脚本. 二·作用 相对于resource文件夹下面的东西打包后定死只读,无法修改. AB包 ...