成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在JavaScript中從外部解決Promise:實際應(yīng)用場景

開發(fā) 前端
從外部解決Promise可以解鎖強大的模式。它保持你的代碼清晰和靈活,從用戶操作到事件流。而像ts-deferred這樣的庫為我們提供了更好的處理方式。

這是JavaScript中那些在現(xiàn)實世界中極其強大的酷炫技巧之一。

強大的實際應(yīng)用場景

動作(A)等待另一個動作(B)

A正在進行,但用戶想做B,而A需要先發(fā)生。

例如:社交應(yīng)用,用戶可以創(chuàng)建、保存和發(fā)布帖子。就像Medium。

<p>
  Save status:
  <b><span id="save-status">Not saved</span></b>
</p>
<p>
  Publish status:
  <b><span id="publish-status">Not published</span></b>
</p>
<button id="save">Save</button>
<button id="publish">Publish</button>

圖片圖片

如果用戶想在帖子保存時發(fā)布怎么辦?

解決方案:確保在發(fā)布之前帖子已保存。

saveButton.onclick = () => {
  save();
};

publishButton.onclick = async () => {
  await publish();
};

let saveResolve;

let hasSaved = false;

async function save() {
  hasSaved = false;
  saveStatus.textContent = 'Saving...';
  // ? Resolve promise from outside
  await makeSaveRequest();
  saveResolve();
  hasSaved = true;
  saveStatus.textContent = 'Saved';
}

async function waitForSave() {
  if (!hasSaved) {
    await new Promise((resolve) => {
      saveResolve = resolve;
    });
  }
}

async function publish() {
  publishStatus.textContent = 'Waiting for save...';
  await waitForSave();
  publishStatus.textContent = 'Published';
  return;
}

圖片圖片

當你將這個邏輯抽象成一種Deferred類時,它變得更好:

class Deferred {
  constructor() {
    this.promise = new Promise((resolve, reject) => {
      this.reject = reject;
      this.resolve = resolve;
    });
  }
}

const deferred = new Deferred();

// Resolve from outside
deferred.resolve();

重構(gòu)?:

const deferredSave = new Deferred();
let hasSaved = false;

async function save() {
  hasSaved = false;
  saveStatus.textContent = 'Saving...';
  // ?? Resolve promise from outside
  await makeSaveRequest();
  saveResolve();
  hasSaved = true;
  saveStatus.textContent = 'Saved';
}

async function waitForSave() {
  if (!hasSaved) await deferredSave.promise;
}

async function publish() {
  // ...
}

它的工作方式與之前完全相同:

圖片圖片

Deferred更加清晰,這就是為什么我們有很多類似的NPM庫:ts-deferred、deferred、promise-deferred...

圖片圖片

將事件流轉(zhuǎn)換為Promise

這是我多次使用過的一個很好的設(shè)置。

執(zhí)行一個異步任務(wù),實際上是在內(nèi)部等待事件流觸發(fā):

// data-fetcher.js
const deferred = new Deferred();

let dataDeferred;
function startListening() {
  dataDeferred = new Deferred();

  eventStream.on('data', (data) => {
    dataDeferred.resolve(data);
  });
}

async function getData() {
  return await dataDeferred.promise;
}

// client.js
const { startListening, getData } = require('./data-fetcher.js');
startListening();
// ?? Waits for event to happen once
const data = await getData();

最后的思考

從外部解決Promise可以解鎖強大的模式。

它保持你的代碼清晰和靈活,從用戶操作到事件流。而像ts-deferred這樣的庫為我們提供了更好的處理方式。

責任編輯:武曉燕 來源: 大遷世界
相關(guān)推薦

2020-08-14 10:00:34

Node前端應(yīng)用

2017-11-27 09:11:42

SSDceph應(yīng)用

2011-05-17 15:24:18

Shibboleth認證

2023-11-15 13:35:00

迭代器生成器Python

2021-03-03 10:11:16

區(qū)塊鏈商業(yè)工業(yè)

2015-08-04 15:21:17

SDN公有云軟件定義網(wǎng)絡(luò)

2020-10-16 09:09:20

機器學習銀行技術(shù)

2012-10-23 09:32:07

2015-04-15 14:44:06

SDN交換機云計算網(wǎng)絡(luò)SDN

2015-06-16 13:52:25

Mesos集群管理Hadoop

2015-06-10 10:52:36

云計算交換機云網(wǎng)絡(luò)

2022-12-08 10:40:06

聲明式事務(wù)AOP

2010-08-31 19:45:26

DHCP server

2024-03-12 10:36:06

函數(shù)指針代碼

2021-03-31 22:37:03

數(shù)據(jù)中臺企業(yè)技術(shù)

2015-07-23 11:59:27

JavascriptPromise

2015-05-15 10:09:48

Docker應(yīng)用場景項目價值最大化

2023-10-24 17:14:52

Kafka分布式系統(tǒng)

2009-11-03 11:03:00

CDN接入技術(shù)

2024-02-27 16:27:42

物聯(lián)網(wǎng)IOT智能連接
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩三| 欧美精品中文字幕久久二区 | 视频第一区 | 成人黄色av网址 | 日韩黄色av | 久久久久久久综合色一本 | 亚洲bt 欧美bt 日本bt | 欧美极品一区二区 | 国产精品jizz在线观看老狼 | 99精品九九| 日韩视频在线一区 | 成人妇女免费播放久久久 | 国产aⅴ爽av久久久久久久 | 成人片网址| 特黄一级 | 成人免费三级电影 | 国产免费av网 | 国产午夜精品久久久 | 亚洲欧美日韩在线 | 国产日韩一区二区 | 久久久久av | 国产色婷婷久久99精品91 | 国产伦一区二区三区四区 | 日本亚洲一区二区 | 日韩国产中文字幕 | 在线一级片 | 久久久久国产精品一区二区 | 亚洲欧美日韩精品久久亚洲区 | 99在线精品视频 | 欧美激情国产精品 | 97精品超碰一区二区三区 | 国产毛片毛片 | 亚洲高清网| 国产日韩欧美另类 | 欧美一级欧美一级在线播放 | 久久久久久99 | 久久一久久 | 国产不卡一 | 色综合99 | 成人免费看片网 | 国产精品久久久久久久久久久久久久 |