JS异步编程——promise

tech2024-07-10  67

一 、同步与异步

同步任务是指在主线程上排队执行的任务,只有前一个任务执行完毕,才能继续执行下一个任务,任务是顺序执行的。异步则指当程序顺序执行碰到某个异步任务时,则会把这个任务挂起,继续执行后面的同步代码代码,等到需要去执行异步代码的时候再去执行它,这就是异步,JS并不会傻呵呵的等着异步任务的执行,而是继续执行了后面的代码。

二、Promise

Promise 是一个对象,它代表了一个异步操作的最终完成或者失败,它只会有三种状态:pending 准备状态、resolved 成功状态、rejected 拒绝状态,并且成为某种状态后就无法再对状态进行改变,Promise和then是配套出现的,then是对上一个Promise状态改变的处理。每个then返回的其实也是一个Promise。首先介绍如何创建一个 Promise对象: new Promise((resolve,reject)=>{ resolve("成功调用") //reject("失败调用"); }).then( value => { console.log("成功调用"); }, reject => { console.log("失败调用"); } )

then中第一个函数是成功的回调函数,第二个函数是失败的回调函数。then中一般只包含成功的处理函数,而失败的处理函数一般放在catch中。 2. 连续执行两个或者多个异步操作是一个常见的需求,在上一个操作执行成功之后,开始下一个的操作,并带着上一步操作所返回的结果。我们可以通过创造一个 Promise 链来实现这种需求。 如果不适用Promise,则要做多重异步操作就会导致经典的回调地狱:

doSomething(function(result) { doSomethingElse(result, function(newResult) { doThirdThing(newResult, function(finalResult) { console.log('Got the final result: ' + finalResult); }, failureCallback); }, failureCallback); }, failureCallback);

这会使代码的可读性大大下降。 现在,我们可以把回调绑定到返回的 Promise 上,形成一个 Promise 链:

doSomething().then(function(result) { return doSomethingElse(result); }) .then(function(newResult) { return doThirdThing(newResult); }) .then(function(finalResult) { console.log('Got the final result: ' + finalResult); }) .catch(failureCallback);

这里我们在每个then中都只绑定了成功的回调函数,失败的回调统一放在catch中处理。 一般在then中会返回一个Promise对象,紧接着后面的then就作为前面返回的Promise的成功回调函数。

最新回复(0)