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){
return { then: (successCallbal, failureCallback) => {
}, } }
createAudioFileAsync(options).then(res=>{ console.log(res) }, err=>{ console.log(err) })
|
约定
不同于“老式“的传入回调,在使用Promise时,会有以下约定:
- 在本轮事件循环运行完成之前,回调函数是不会被调用的
- 即使异步操作已经完成(成功或失败),在这之后通过**then()**添加的回调函数也会被调用
- 通过多次调用**then()**可以添加多个回调函数,它们会按照插入顺序进行执行。
链式调用
在上一个操作执行成功之后,开始下一个的操作,并带着上一步操作所返回的结果。
为了实现这个需求,那么then的返回值必须也要是一个Promise,并且是一个和原来不同的新的Promise
那么上面的代码就可以改为:
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