Loading

个人技术总结

一、技术概述

Promise是JavaScript的一个标准内置对象,被分类为控制抽象对象。控制抽象对象可以帮助构造代码,尤其是异步代码。Promise对象用于表示一个异步操作的最终完成(或失败)及其结果值。
学习该技术的原因是发现自己代码的执行顺序发生了变化,了解了一下发现是异步操作的问题,然后就了解了一下promise处理异步操作的技术。

二、技术详述

Promise可以把几个异步操作之间的关系变成同步的,保证在执行下一个异步操作时,前一个异步操作已经执行完毕。
Promise对象必然处于以下几种状态之一:
待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
已兑现(fulfilled): 意味着操作成功完成。
已拒绝(rejected): 意味着操作失败。
当Promise处于已兑现或者已拒绝状态时,用Promise的then方法排列起来的相关处理程序就会被调用,调用已兑现时或者已拒绝的回调函数。

  • resolve()函数会让promise对象的状态变为已兑现
  • 如果代码中出现了异常,promise对象会变为已拒绝
    代码
new Promise(function(resolve, reject) {
      request({
        url: app.globalData.baseUrl+'/api/party/partymes',
        method: 'GET',
        data: {
          partyId: parseInt(_this.data.partyID)
        },
        success: function (res) {
          resolve(data.images);
        },
        fail: function (res) {
          console.log(res);
          reject()
        }
      });
    }).then((images) => {
      console.log('publisherID--------', this.data.partyPublisherID)
      this.setData({
        imageUrlsArr: processSuffix(images)
      })
      let promise = this.getPublisherMessage()
      return promise
    }).then(() => {
      return this.getUserId()
    }).then(() => {
      let {partyParticipantsId} = this.data
      this.getMembersInfoArr()
    }).then(() => {
      wx.hideLoading({
        success: (res) => {},
      })
    })

这里有很明显的链式调用,几个then()都可以当成异步操作,他们之间的关系是同步的,后一个异步操作执行时
流程图:
image

三、困难和解决过程

困难:定义了一个方法,方法里面有异步操作。在代码中调用该方法,需要保证该方法中的异步操作执行完后再执行下一步。如下:

function test(){
    setTimeout(() => saySomething("10 seconds passed"), 10000);
}
{
test();
console.log("输出");
}

解决方法:可以在方法中返回一个promise,利用promise已兑现时的回调函数来保证执行顺序的正确

function test(){
    const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
    return wait(10000).then(() => saySomething("10 seconds")).catch(failureCallback);
}
{
    test();
    console.log("输出");
}

这样就会保证“输出”在“10 seconds passed”后输出

四、总结

异步操作是个需要好好处理的点,除了Promise以外还有其他需要学习的处理异步操作的方法,Promise还有许多实用的方法,还需要继续学习。

五、参考文献

MDN Web Docs

posted @ 2021-06-27 15:44  岩王帝君  阅读(52)  评论(0编辑  收藏  举报