.then()チェーンで以前のpromiseの結果にアクセスするにはどうすればよいですか?

674
Bergi 2015-02-01 00:41.

私はに私のコードを再構築してきた約束、そして素晴らしい長い建てフラット約束チェーンを複数からなる、.then()コールバック。最後に、いくつかの複合値を返したいので、複数の中間のpromise結果にアクセスする必要があります。ただし、シーケンスの途中からの解像度値は、最後のコールバックのスコープ内にありません。どのようにアクセスしますか?

function getExample() {
    return promiseA(…).then(function(resultA) {
        // Some processing
        return promiseB(…);
    }).then(function(resultB) {
        // More processing
        return // How do I gain access to resultA here?
    });
}

16 answers

391
Bergi 2015-02-01 00:44.

チェーンを壊す

チェーンの中間値にアクセスする必要がある場合は、チェーンを必要な単一の部分に分割する必要があります。1つのコールバックをアタッチして、そのパラメーターを複数回使用しようとする代わりに、結果値が必要な場合は常に、同じPromiseに複数のコールバックをアタッチします。約束は単に将来の価値を表す(プロキシする)ことを忘れないでください!線形チェーンで一方のpromiseを他方から導出する次に、ライブラリから提供されたpromiseコンビネータを使用して結果値を作成します。

これにより、非常に単純な制御フロー、機能の明確な構成、したがって簡単なモジュール化が実現します。

function getExample() {
    var a = promiseA(…);
    var b = a.then(function(resultA) {
        // some processing
        return promiseB(…);
    });
    return Promise.all([a, b]).then(function([resultA, resultB]) {
        // more processing
        return // something using both resultA and resultB
    });
}

その後のコールバックでのパラメーターの破棄はPromise.allES6でのみ使用可能になりましたが、ES5では、then呼び出しは多くのPromiseライブラリ(QBluebirdwhen、…)によって提供される気の利いたヘルパーメソッドに置き換えられました.spread(function(resultA, resultB) { …

ブルーバードは、専用の特長join機能をその置き換えるためにPromise.all+のspread単純(かつ効率的)構造と組み合わせました:

…
return Promise.join(a, b, function(resultA, resultB) { … });
247
Bergi 2015-02-01 00:43.

ECMAScriptハーモニー

もちろん、この問題は言語設計者によっても認識されていました。彼らは多くの仕事をし、非同期関数の提案はついにそれを実現しました

ECMAScript 8

then非同期関数(呼び出されたときにpromiseを返す)のように、promiseが直接解決されるのを待つだけでよいため、単一の呼び出し関数やコールバック関数はもう必要ありません。また、条件、ループ、try-catch-clausesなどの任意の制御構造も備えていますが、便宜上、ここでは必要ありません。

async function getExample() {
    var resultA = await promiseA(…);
    // some processing
    var resultB = await promiseB(…);
    // more processing
    return // something using both resultA and resultB
}

ECMAScript 6

ES8を待っている間、私たちはすでに非常によく似た種類の構文を使用していました。ES6にはジェネレーター関数が付属しており、任意に配置されたyieldキーワードで実行を分割することができます。これらのスライスは、独立して、非同期でさえ、次々に実行できます。これは、次のステップを実行する前に、promiseの解決を待ちたいときに行うことです。

専用のライブラリ(cotask.jsなど)がありますが、多くのPromiseライブラリにはヘルパー関数(QBluebirdwhen、…)があり、ジェネレーター関数を指定すると、この非同期の段階的な実行が行われます。約束をもたらします。

var getExample = Promise.coroutine(function* () {
//               ^^^^^^^^^^^^^^^^^ Bluebird syntax
    var resultA = yield promiseA(…);
    // some processing
    var resultB = yield promiseB(…);
    // more processing
    return // something using both resultA and resultB
});

これはバージョン4.0以降のNode.jsで機能しました。また、いくつかのブラウザー(またはその開発エディション)は比較的早い段階でジェネレーター構文をサポートしていました。

ECMAScript 5

ただし、下位互換性が必要な場合は、トランスパイラーなしで使用することはできません。ジェネレーター関数と非同期関数の両方が現在のツールでサポートされています。たとえば、ジェネレーター非同期関数に関するBabelのドキュメントを参照してください。

そして、 非同期プログラミングを容易にすることに専念している他の多くのJSへコンパイル言語もあります。彼らは通常と同様の構文を使用await(例えば、アイスのCoffeeScriptを)が、Haskellのような特徴と、他にもありますdo-notation(例えばLatteJsモナドPureScriptまたはLispyScriptが)。

103
Esailija 2015-02-01 03:16.

同期検査

後で必要な値のpromiseを変数に割り当て、同期検査を介してそれらの値を取得します。この例ではbluebirdの.value()方法を使用していますが、多くのライブラリが同様の方法を提供しています。

function getExample() {
    var a = promiseA(…);

    return a.then(function() {
        // some processing
        return promiseB(…);
    }).then(function(resultB) {
        // a is guaranteed to be fulfilled here so we can just retrieve its
        // value synchronously
        var aValue = a.value();
    });
}

これは、必要な数の値に使用できます。

function getExample() {
    var a = promiseA(…);

    var b = a.then(function() {
        return promiseB(…)
    });

    var c = b.then(function() {
        return promiseC(…);
    });

    var d = c.then(function() {
        return promiseD(…);
    });

    return d.then(function() {
        return a.value() + b.value() + c.value() + d.value();
    });
}
58
Bergi 2015-02-01 00:42.

ネスト(および)クロージャ

変数のスコープ(この場合は成功コールバック関数パラメーター)を維持するためにクロージャーを使用することは、自然なJavaScriptソリューションです。promiseを使用すると、 .then()コールバックを任意にネストしてフラット化できます。内部のコールバックのスコープを除いて、意味的には同等です。

function getExample() {
    return promiseA(…).then(function(resultA) {
        // some processing
        return promiseB(…).then(function(resultB) {
            // more processing
            return // something using both resultA and resultB;
        });
    });
}

もちろん、これはインデントピラミッドを構築しています。インデントが大きくなりすぎた場合でも、古いツールを適用して、運命ピラミッドに対抗することができます。モジュール化して、追加の名前付き関数を使用し、変数が不要になったらすぐにプロミスチェーンをフラット化します。
理論的には、(すべてのクロージャを明示的にすることで)2レベルを超えるネストを常に回避でき、実際には妥当な数だけ使用します。

function getExample() {
    // preprocessing
    return promiseA(…).then(makeAhandler(…));
}
function makeAhandler(…)
    return function(resultA) {
        // some processing
        return promiseB(…).then(makeBhandler(resultA, …));
    };
}
function makeBhandler(resultA, …) {
    return function(resultB) {
        // more processing
        return // anything that uses the variables in scope
    };
}

また、この種のヘルパー関数を使用することができ、部分的アプリケーションのように、_.partialからアンダー/ lodashまたはネイティブ.bind()メソッドはさらに減少のインデントに、:

function getExample() {
    // preprocessing
    return promiseA(…).then(handlerA);
}
function handlerA(resultA) {
    // some processing
    return promiseB(…).then(handlerB.bind(null, resultA));
}
function handlerB(resultA, resultB) {
    // more processing
    return // anything that uses resultA and resultB
}
50
Bergi 2015-02-01 00:42.

明示的なパススルー

コールバックのネストと同様に、この手法はクロージャに依存しています。それでも、チェーンはフラットなままです。最新の結果だけを渡すのではなく、すべてのステップでいくつかの状態オブジェクトが渡されます。これらの状態オブジェクトは、前のアクションの結果を蓄積し、後で再び必要になるすべての値と現在のタスクの結果を渡します。

function getExample() {
    return promiseA(…).then(function(resultA) {
        // some processing
        return promiseB(…).then(b => [resultA, b]); // function(b) { return [resultA, b] }
    }).then(function([resultA, resultB]) {
        // more processing
        return // something using both resultA and resultB
    });
}

ここで、その小さな矢印b => [resultA, b]は、を閉じてresultA、両方の結果の配列を次のステップに渡す関数です。これは、パラメーター分解構文を使用して、パラメーターを再び単一の変数に分割します。

ES6でデストラクチャリングが利用可能になる前は、呼び出された気の利いたヘルパーメソッド.spread()が多くのpromiseライブラリ(QBluebirdwhen、…)によって提供されていました。として使用される複数のパラメーター(配列要素ごとに1つ)を持つ関数を取ります.spread(function(resultA, resultB) { …

もちろん、ここで必要なクロージャーは、いくつかのヘルパー関数によってさらに単純化できます。

function addTo(x) {
    // imagine complex `arguments` fiddling or anything that helps usability
    // but you get the idea with this simple one:
    return res => [x, res];
}

…
return promiseB(…).then(addTo(resultA));

または、を使用Promise.allして配列のpromiseを生成することもできます。

function getExample() {
    return promiseA(…).then(function(resultA) {
        // some processing
        return Promise.all([resultA, promiseB(…)]); // resultA will implicitly be wrapped
                                                    // as if passed to Promise.resolve()
    }).then(function([resultA, resultB]) {
        // more processing
        return // something using both resultA and resultB
    });
}

また、配列だけでなく、任意に複雑なオブジェクトを使用する場合もあります。たとえば、別のヘルパー関数を使用する_.extend場合Object.assignと使用する場合です。

function augment(obj, name) {
    return function (res) { var r = Object.assign({}, obj); r[name] = res; return r; };
}

function getExample() {
    return promiseA(…).then(function(resultA) {
        // some processing
        return promiseB(…).then(augment({resultA}, "resultB"));
    }).then(function(obj) {
        // more processing
        return // something using both obj.resultA and obj.resultB
    });
}

このパターンはフラットチェーンを保証し、明示的な状態オブジェクトは明快さを向上させることができますが、長いチェーンでは面倒になります。特に、状態が散発的にしか必要ない場合でも、すべてのステップを通過する必要があります。この固定インターフェースにより、チェーン内の単一のコールバックはかなり緊密に結合され、変更するのに柔軟性がありません。これにより、単一ステップの因数分解が難しくなり、コールバックを他のモジュールから直接提供することはできません。コールバックは、状態を考慮した定型コードで常にラップする必要があります。上記のような抽象的なヘルパー関数は、痛みを少し和らげることができますが、常に存在します。

35
Bergi 2015-02-01 00:43.

可変コンテキスト状態

些細な(しかしエレガントではなく、エラーが発生しやすい)解決策は、スコープの高い変数(チェーン内のすべてのコールバックがアクセスできる)を使用し、取得時に結果値を書き込むことです。

function getExample() {
    var resultA;
    return promiseA(…).then(function(_resultA) {
        resultA = _resultA;
        // some processing
        return promiseB(…);
    }).then(function(resultB) {
        // more processing
        return // something using both resultA and resultB
    });
}

多くの変数の代わりに、(最初は空の)オブジェクトを使用することもできます。このオブジェクトには、動的に作成されたプロパティとして結果が保存されます。

このソリューションにはいくつかの欠点があります。

  • なぜグローバルステートはとても邪悪なのですか?状態は醜くなぜグローバルステートはとても邪悪なのですか?です。
  • このパターンは関数の境界を越えて機能しません。関数の宣言が共有スコープを離れてはならないため、関数のモジュール化は困難です。
  • 変数のスコープは、初期化される前に変数にアクセスすることを妨げません。これは、競合状態が発生する可能性のある複雑なプロミス構造(ループ、分岐、例外)で特に発生する可能性があります。状態を明示的に渡すことは、奨励を約束する宣言型の設計であり、これを防ぐことができるよりクリーンなコーディングスタイルを強制します。
  • これらの共有変数のスコープを正しく選択する必要があります。たとえば、状態がインスタンスに格納されている場合のように、複数の並列呼び出し間の競合状態を防ぐために、実行された関数に対してローカルである必要があります。

Bluebirdライブラリは、渡されるオブジェクトの使用を推奨し、そのbind()メソッドを使用してコンテキストオブジェクトをpromiseチェーンに割り当てます。他の方法では使用できないthisキーワードを介して、各コールバック関数からアクセスできます。オブジェクトのプロパティは変数よりもタイプミスが検出されにくい傾向がありますが、パターンは非常に巧妙です。

function getExample() {
    return promiseA(…)
    .bind({}) // Bluebird only!
    .then(function(resultA) {
        this.resultA = resultA;
        // some processing
        return promiseB(…);
    }).then(function(resultB) {
        // more processing
        return // something using both this.resultA and resultB
    }).bind(); // don't forget to unbind the object if you don't want the
               // caller to access it
}

このアプローチは、.bindをサポートしないpromiseライブラリで簡単にシミュレートできます(ただし、多少冗長な方法であり、式で使用することはできません)。

function getExample() {
    var ctx = {};
    return promiseA(…)
    .then(function(resultA) {
        this.resultA = resultA;
        // some processing
        return promiseB(…);
    }.bind(ctx)).then(function(resultB) {
        // more processing
        return // something using both this.resultA and resultB
    }.bind(ctx));
}
16
Jay 2017-03-25 10:08.

「ミュータブルコンテキスト状態」のそれほど厳しくないスピン

ローカルスコープのオブジェクトを使用してプロミスチェーンの中間結果を収集することは、提起した質問に対する合理的なアプローチです。次のスニペットについて考えてみます。

function getExample(){
    //locally scoped
    const results = {};
    return promiseA(paramsA).then(function(resultA){
        results.a = resultA;
        return promiseB(paramsB);
    }).then(function(resultB){
        results.b = resultB;
        return promiseC(paramsC);
    }).then(function(resultC){
        //Resolve with composite of all promises
        return Promise.resolve(results.a + results.b + resultC);
    }).catch(function(error){
        return Promise.reject(error);
    });
}
  • グローバル変数は悪いので、このソリューションはローカルスコープの変数を使用しますが、害はありません。関数内でのみアクセスできます。
  • 変更可能な状態は醜いですが、これは醜い方法で状態を変更しません。醜い可変状態は、伝統的に関数の引数またはグローバル変数の状態を変更することを指しますが、このアプローチは、promiseの結果を集約することのみを目的として存在するローカルスコープの変数の状態を変更するだけです...単純な死を迎える変数約束が解決したら。
  • 中間のpromiseが結果オブジェクトの状態にアクセスすることを妨げられることはありませんが、これは、チェーン内のpromiseの1つが不正になり、結果を妨害するという恐ろしいシナリオを導入しません。promiseの各ステップで値を設定する責任はこの関数に限定され、全​​体的な結果は正しいか正しくないかのどちらかになります...それは(意図しない限り)本番環境で数年後に発生するバグではありません。 !)
  • これは、getExample関数の呼び出しごとに結果変数の新しいインスタンスが作成されるため、並列呼び出しから発生する競合状態のシナリオを導入しません。
8
Anthony 2017-01-22 12:14.

Node 7.4は、ハーモニーフラグを使用した非同期/待機呼び出しをサポートするようになりました。

これを試して:

async function getExample(){

  let response = await returnPromise();

  let response2 = await returnPromise2();

  console.log(response, response2)

}

getExample()

次のコマンドでファイルを実行します。

node --harmony-async-await getExample.js

できる限りシンプル!

8
yzfdjzwl 2017-07-25 20:34.

この日、私もあなたのようないくつかの質問に出会うことができます。ついに、私は質問で良い解決策を見つけました、それは簡単で読むのが良いです。これがお役に立てば幸いです。

よるとどのようにツーチェーンのjavascript-約束

わかりました、コードを見てみましょう:

const firstPromise = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('first promise is completed');
            resolve({data: '123'});
        }, 2000);
    });
};

const secondPromise = (someStuff) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('second promise is completed');
            resolve({newData: `${someStuff.data} some more data`});
        }, 2000);
    });
};

const thirdPromise = (someStuff) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('third promise is completed');
            resolve({result: someStuff});
        }, 2000);
    });
};

firstPromise()
    .then(secondPromise)
    .then(thirdPromise)
    .then(data => {
        console.log(data);
    });
6
Anthony 2015-11-21 09:59.

別の答え、babel-nodeバージョン<6を使用

使用する async - await

npm install -g [email protected]

example.js:

async function getExample(){

  let response = await returnPromise();

  let response2 = await returnPromise2();

  console.log(response, response2)

}

getExample()

次に、実行babel-node example.jsして出来上がり!

2
Anthony 2015-08-12 08:35.

私はグローバル変数の使用があまり好きではないので、このパターンを自分のコードで使用するつもりはありません。ただし、ピンチでは機能します。

ユーザーは有望なマングースモデルです。

var globalVar = '';

User.findAsync({}).then(function(users){
  globalVar = users;
}).then(function(){
  console.log(globalVar);
});
2
amaksr 2017-06-10 14:56.

シーケンシャルエグゼキュータnsynjsを使用した別の答え:

function getExample(){

  var response1 = returnPromise1().data;

  // promise1 is resolved at this point, '.data' has the result from resolve(result)

  var response2 = returnPromise2().data;

  // promise2 is resolved at this point, '.data' has the result from resolve(result)

  console.log(response, response2);

}

nynjs.run(getExample,{},function(){
    console.log('all done');
})

更新:作業例を追加

function synchronousCode() {
     var urls=[
         "https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js",
         "https://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js",
         "https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"
     ];
     for(var i=0; i<urls.length; i++) {
         var len=window.fetch(urls[i]).data.text().data.length;
         //             ^                   ^
         //             |                   +- 2-nd promise result
         //             |                      assigned to 'data'
         //             |
         //             +-- 1-st promise result assigned to 'data'
         //
         console.log('URL #'+i+' : '+urls[i]+", length: "+len);
     }
}

nsynjs.run(synchronousCode,{},function(){
    console.log('all done');
})
<script src="https://rawgit.com/amaksr/nsynjs/master/nsynjs.js"></script>

1
alphakevin 2016-06-12 20:33.

bluebirdを使用する場合、.bindメソッドを使用してPromiseチェーン内の変数を共有できます。

somethingAsync().bind({})
.spread(function (aValue, bValue) {
    this.aValue = aValue;
    this.bValue = bValue;
    return somethingElseAsync(aValue, bValue);
})
.then(function (cValue) {
    return this.aValue + this.bValue + cValue;
});

詳細については、次のリンクを確認してください。

http://bluebirdjs.com/docs/api/promise.bind.html

1
Minh Giang 2017-03-03 23:45.
function getExample() {
    var retA, retB;
    return promiseA(…).then(function(resultA) {
        retA = resultA;
        // Some processing
        return promiseB(…);
    }).then(function(resultB) {
        // More processing
        //retA is value of promiseA
        return // How do I gain access to resultA here?
    });
}

簡単な方法:D

1
Vishu 2017-08-30 00:34.

RSVPのハッシュが使えると思います。

以下のようなもの:

    const mainPromise = () => {
        const promise1 = new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log('first promise is completed');
                resolve({data: '123'});
            }, 2000);
        });

        const promise2 = new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log('second promise is completed');
                resolve({data: '456'});
            }, 2000);
        });

        return new RSVP.hash({
              prom1: promise1,
              prom2: promise2
          });

    };


   mainPromise()
    .then(data => {
        console.log(data.prom1);
        console.log(data.prom2);
    });
0
David Spector 2019-08-28 10:17.

解決:

'bind'を使用して、後の 'then'関数のスコープに中間値を明示的に配置できます。これは、Promisesの動作方法を変更する必要がなく、エラーがすでに伝播されているのと同じように、値を伝播するために1行か2行のコードを必要とするだけの優れたソリューションです。

完全な例を次に示します。

// Get info asynchronously from a server
function pGetServerInfo()
    {
    // then value: "server info"
    } // pGetServerInfo

// Write into a file asynchronously
function pWriteFile(path,string)
    {
    // no then value
    } // pWriteFile

// The heart of the solution: Write formatted info into a log file asynchronously,
// using the pGetServerInfo and pWriteFile operations
function pLogInfo(localInfo)
    {
    var scope={localInfo:localInfo}; // Create an explicit scope object
    var thenFunc=p2.bind(scope); // Create a temporary function with this scope
    return (pGetServerInfo().then(thenFunc)); // Do the next 'then' in the chain
    } // pLogInfo

// Scope of this 'then' function is {localInfo:localInfo}
function p2(serverInfo)
    {
    // Do the final 'then' in the chain: Writes "local info, server info"
    return pWriteFile('log',this.localInfo+','+serverInfo);
    } // p2

このソリューションは、次のように呼び出すことができます。

pLogInfo("local info").then().catch(err);

(注:このソリューションのより複雑で完全なバージョンはテストされていますが、このサンプルバージョンはテストされていないため、バグがある可能性があります。)

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

2021 年 6 月 8 日にニューヨーク市で開催された covid-19 パンデミックで亡くなった人々の命を偲び、祝うために、ネーミング ザ ロスト メモリアルズが主催するイベントと行進の最中に、グリーンウッド墓地の正門から記念碑がぶら下がっています。週末、ジョー・バイデン大統領は、covid-19 パンデミックの終息を宣言しました。これは、過去 2 年以上にわたり、公の場でそうするための長い列の中で最新のものです。

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

オハイオ州のエミリー・デシャネル みんな早く来て、ボーンズが帰ってきた!まあ、ショーボーンズではなく、彼女を演じた俳優. エミリー・デシャネルに最後に会ってからしばらく経ちました.Emily Deschanel は、長期にわたるプロシージャルな Bones の Temperance “Bones” Brennan としてよく知られています。

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

どうやら、ドナルド・トランプに近い人々は、今月初めにFBIによって家宅捜索された彼のMar-a-Lago財産からの映像を公開するよう彼に勧めています. 前大統領はテープを公開するかどうかを確認していませんが、息子はフォックス・ニュースにそうなるだろうと語った.

Andor は、他の Star Wars ショーから大きな距離を置きます。

Andor は、他の Star Wars ショーから大きな距離を置きます。

アンドールの一場面。数十年前、ジョージ・ルーカスがスター・ウォーズのテレビ番組を制作するのを妨げた主な理由は、お金でした。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language