Promise

Promise

ES6规定,Promise是一个构造函数,用来生成Promise实例。

本质上 Promise 是一个函数返回的对象,我们可以在它上面绑定回调函数,这样我们就不需要在一开始把回调函数作为参数传入这个函数了。

传统回调写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 成功的回调函数
function successCallback(result) {
console.log("音频文件创建成功:" + result);
}

// 失败的回调函数
function failureCallback(error) {
console.log("音频文件创建失败:" + error);
}

function createAudioFileAsync(options, successCallbal, failureCallback){
//....
}

createAudioFileAsync(audioSettings, successCallback, failureCallback)

Promise写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 function createAudioFileAsync(options){

//options一些操作

return {
then: (successCallbal, failureCallback) => {
//if success
//调用 successCallbal(res)

//if failure
//调用 failureCallback(err)
},
//...
}
}

createAudioFileAsync(options).then(res=>{
console.log(res)
}, err=>{
console.log(err)
})

约定

不同于“老式“的传入回调,在使用Promise时,会有以下约定:

  • 在本轮事件循环运行完成之前,回调函数是不会被调用的
  • 即使异步操作已经完成(成功或失败),在这之后通过**then()**添加的回调函数也会被调用
  • 通过多次调用**then()**可以添加多个回调函数,它们会按照插入顺序进行执行。

链式调用

在上一个操作执行成功之后,开始下一个的操作,并带着上一步操作所返回的结果。

为了实现这个需求,那么then的返回值必须也要是一个Promise,并且是一个和原来不同的新的Promise

那么上面的代码就可以改为:

1

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Using_promises

https://es6.ruanyifeng.com/#docs/promise

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=68018901_2_oem_dg&wd=promise%20then%E6%80%8E%E4%B9%88%E5%AE%9E%E7%8E%B0%E9%93%BE%E5%BC%8F&oq=es6%2520%25E9%2598%25AE%25E4%25B8%2580%25E5%25B3%25B0&rsv_pq=8b5127120009353a&rsv_t=0a66srpXrFkVwsW%2B9qSxYiVBExgCmfVjLkCmhDcpIRmlO2CHA9hsvzpbgxz2s%2F31E6ApBtyNNoY&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_btype=t&inputT=10926&rsv_sug3=54&rsv_sug1=43&rsv_sug7=101&rsv_sug2=0&rsv_sug4=13029


Promise
http://example.com/2023/02/13/Promise/
作者
John Doe
发布于
2023年2月13日
许可协议