自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在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;
}

圖片圖片

當(dāng)你將這個邏輯抽象成一種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這樣的庫為我們提供了更好的處理方式。

責(zé)任編輯:武曉燕 來源: 大遷世界
相關(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

機器學(xué)習(xí)銀行技術(shù)

2015-04-15 14:44:06

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

2012-10-23 09:32:07

2015-06-10 10:52:36

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

2015-06-16 13:52:25

Mesos集群管理Hadoop

2015-07-23 11:59:27

JavascriptPromise

2022-12-08 10:40:06

聲明式事務(wù)AOP

2021-03-31 22:37:03

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

2023-10-24 17:14:52

Kafka分布式系統(tǒng)

2015-05-15 10:09:48

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

2024-03-12 10:36:06

函數(shù)指針代碼

2010-08-31 19:45:26

DHCP server

2010-12-21 16:23:34

RADVISION云視頻

2015-10-13 10:44:01

扁平網(wǎng)絡(luò)EIP云網(wǎng)絡(luò)環(huán)境
點贊
收藏

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