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

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

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

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

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

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

A正在進(jìn)行,但用戶想做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可以解鎖強(qiáng)大的模式。

它保持你的代碼清晰和靈活,從用戶操作到事件流。而像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認(rèn)證

2023-11-15 13:35:00

迭代器生成器Python

2015-08-04 15:21:17

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

2021-03-03 10:11:16

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

2020-10-16 09:09:20

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

2012-10-23 09:32:07

2015-06-10 10:52:36

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

2015-04-15 14:44:06

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

2015-06-16 13:52:25

Mesos集群管理Hadoop

2022-12-08 10:40:06

聲明式事務(wù)AOP

2021-03-31 22:37:03

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

2015-05-15 10:09:48

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

2015-07-23 11:59:27

JavascriptPromise

2022-09-05 14:46:01

元宇宙區(qū)塊鏈人工智能

2021-12-24 10:24:10

零信任

2019-04-10 15:43:12

SDN場景網(wǎng)絡(luò)架構(gòu)

2015-10-13 10:44:01

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

2023-10-24 17:14:52

Kafka分布式系統(tǒng)
點贊
收藏

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

主站蜘蛛池模板: 久久手机在线视频 | 精品国产一区二区国模嫣然 | 国产传媒毛片精品视频第一次 | 国产高清一区二区三区 | 欧美一a一片一级一片 | 国产精品久久久久一区二区三区 | 一级一级一级毛片 | 亚洲一区二区三区免费在线观看 | 四虎成人免费电影 | 国产精品久久久久久久久久 | 亚洲综合网站 | 日操夜操 | 福利社午夜影院 | 99re6在线视频精品免费 | 久久久做| 久久精品国产久精国产 | 成年人在线播放 | 日韩中文字幕在线播放 | 天天射天天干 | 日韩在线免费 | 成人在线一区二区三区 | 欧美日韩在线观看视频 | 国产精品久久久久不卡 | 国产成人在线一区二区 | 欧美成人影院 | 在线观看成人小视频 | 成人污污视频 | 久久久久久久久久毛片 | 亚洲精品久久久久久久久久久久久 | 亚洲最新在线视频 | 国产电影一区二区三区爱妃记 | 国产91丝袜在线播放 | 欧美aaa一级片 | 欧美激情久久久 | 国产精品免费一区二区三区四区 | 国产成人精品免高潮在线观看 | 国产乱码精品一区二区三区中文 | 国产美女在线精品免费 | 在线中文字幕视频 | av在线一区二区 | 国产精品久久久久久久7电影 |