LoginSignup
1
0

More than 3 years have passed since last update.

RxJSを使用せずにswitchMap(flatMapLatest)を実現する

Posted at

APIにリクエストした時に最後のリクエスト結果だけを取得したいと思う時があり、RxJSのswitchMapに頼ることがあったけど、少し考えてみればなんてことのない処理で実現できた。

最新のPromiseの結果だけを実行する関数
function createPromiseLatest(callback) {
    let latestPromise = null; // 最後に実行したいPromiseを管理
    return function promiseLatest(promise) {
        latestPromise = promise; // 追加されたPromiseを取得
        promise.then((value) => {
            // 最後に実行したいPromiseと追加されたPromiseが一致したら実行
            if (latestPromise === promise) {
                callback(value);
            }
        });
    }
}
使い方
function sleep(ms, value) {
  return new Promise((resolve) => setTimeout(() => {resolve(value);}, ms));
}

const callback = (value) => {
    console.log('Hello ' + value);
}
const promiseLatest = createPromiseLatest(callback);

// 1件目、2件目は処理されるが出力対象にはならない
promiseLatest(sleep(1000, "Mike"));
promiseLatest(sleep(2000, "Henry"));
promiseLatest(sleep(3000, "Bob"));
// console log: Hello Bob

ちなみに最初のPromiseだけ処理したい場合なら下記でできる。

最初のPromiseの結果だけ実行する関数
function createPromiseFirst(callback) {
    let firstPromise = null; // 最初に実行したいPromiseを管理
    return function promiseFirst(promise) {
        if (firstPromise !== null) return; // Promiseがすでにあるなら処理しない
        firstPromise = promise;
        promise.then((value) => {
            callback(value);
        });
    }
}
使い方
function sleep(ms, value) {
  return new Promise((resolve) => setTimeout(() => {resolve(value);}, ms));
}

const callback = (value) => {
    console.log('Hello ' + value);
}
const promiseFirst = createPromiseFirst(callback);

// 2件目、3件目は処理されるが出力対象にはならない
promiseFirst(sleep(1000, "Mike"));
promiseFirst(sleep(2000, "Henry"));
promiseFirst(sleep(3000, "Bob"));
// console log: Hello Mike

便利なものを知りすぎると、すぐにそれにばっかり頼ってしまうので、気をつけたい😭

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0