既存のコールバックAPIをpromiseに変換するにはどうすればよいですか?

747
Benjamin Gruenbaum 2014-03-20 12:47.

promiseを使用したいのですが、次のような形式のコールバックAPIがあります。

1. DOMロードまたはその他の1回限りのイベント:

window.onload; // set to callback
...
window.onload = function() {

};

2.プレーンコールバック:

function request(onChangeHandler) {
    ...
}
request(function() {
    // change happened
    ...
});

3.ノードスタイルのコールバック( "nodeback"):

function getStuff(dat, callback) {
    ...
}
getStuff("dataParam", function(err, data) {
    ...
})

4.ノードスタイルのコールバックを備えたライブラリ全体:

API;
API.one(function(err, data) {
    API.two(function(err, data2) {
        API.three(function(err, data3) {
            ...
        });
    });
});

約束でAPIを使用するにはどうすればよいですか、それを「約束」するにはどうすればよいですか?

19 answers

769
Benjamin Gruenbaum 2014-03-20 12:47.

約束には状態があり、保留中として開始し、次のように解決できます。

  • 計算が正常に完了したこと意味します。
  • 拒否されたということは、計算が失敗したことを意味します。

Promiseを返す関数非同期APIは同期的にスローする必要がありますか?でください。代わりに、拒否を返す必要があります。promise戻り関数からスローする} catch { 、aaの両方を使用する必要があります.catch。約束されたAPIを使用している人々は、約束がスローされることを期待していません。JSで非同期APIがどのように機能するかわからない場合非同期呼び出しから応答を返すにはどうすればよいですか?最初に非同期呼び出しから応答を返すにはどうすればよいですか?非同期呼び出しから応答を返すにはどうすればよいですか?ください。

1. DOMロードまたはその他の1回限りのイベント:

したがって、プロミスを作成するということは、通常、いつ解決するかを指定することを意味します。つまり、データが利用可能である(およびでアクセスできる.then)ことを示すために、履行フェーズまたは拒否フェーズに移行するタイミングを意味します。

PromiseネイティブES6promiseのようなコンストラクターをサポートする最新のpromise実装では、次のようになります。

function load() {
    return new Promise(function(resolve, reject) {
        window.onload = resolve;
    });
}

次に、結果のpromiseを次のように使用します。

load().then(function() {
    // Do things after onload
});

据え置きをサポートするライブラリを使用する場合(ここではこの例で$ qを使用しますが、後でjQueryも使用します):

function load() {
    var d = $q.defer();
    window.onload = function() { d.resolve(); };
    return d.promise;
}

または、APIのようなjQueryを使用して、一度発生するイベントをフックします。

function done() {
    var d = $.Deferred();
    $("#myObject").once("click",function() {
        d.resolve();
    });
    return d.promise();
}

2.プレーンコールバック:

JSではコールバックが一般的であるため、これらのAPIはかなり一般的です。持つの一般的なケースで見てみましょうonSuccessonFail

function getUserData(userId, onLoad, onFail) { …

PromiseネイティブES6promiseのようなコンストラクターをサポートする最新のpromise実装では、次のようになります。

function getUserDataAsync(userId) {
    return new Promise(function(resolve, reject) {
        getUserData(userId, resolve, reject);
    });
}

据え置きをサポートするライブラリを使用する場合(ここではこの例でjQueryを使用しますが、上記の$ qも使用しました):

function getUserDataAsync(userId) {
    var d = $.Deferred();
    getUserData(userId, function(res){ d.resolve(res); }, function(err){ d.reject(err); });
    return d.promise();
}

jQueryは$.Deferred(fn)フォームも提供します。これには、new Promise(fn)フォームを非常に厳密にエミュレートする式を次のように記述できるという利点があります。

function getUserDataAsync(userId) {
    return $.Deferred(function(dfrd) {
        getUserData(userId, dfrd.resolve, dfrd.reject);
    }).promise();
}

注:ここでは、jQueryの遅延メソッドresolverejectメソッドが「デタッチ可能」であるという事実を利用しています。すなわち。それらはjQuery.Deferred()のインスタンスにバインドされています。すべてのライブラリがこの機能を提供しているわけではありません。

3.ノードスタイルのコールバック( "nodeback"):

ノードスタイルのコールバック(ノードバック)には特定の形式があり、コールバックは常に最後の引数であり、その最初のパラメーターはエラーです。まず、手動で約束しましょう。

getStuff("dataParam", function(err, data) { …

に:

function getStuffAsync(param) {
    return new Promise(function(resolve, reject) {
        getStuff(param, function(err, data) {
            if (err !== null) reject(err);
            else resolve(data);
        });
    });
}

据え置きを使用すると、次のことができます(この例では、Qを使用しますが、Qは、defer()。promiseとPromiseの違いある新しい構文defer()。promiseとPromiseの違いサポートするdefer()。promiseとPromiseの違い)。

function getStuffAsync(param) {
    var d = Q.defer();
    getStuff(param, function(err, data) {
        if (err !== null) d.reject(err);
        else d.resolve(data);
    });
    return d.promise;   
}

一般に、手動で約束しすぎないでください。ノードを念頭に置いて設計されたほとんどのPromiseライブラリと、Node 8以降のネイティブPromiseには、ノードバックを約束するためのメソッドが組み込まれています。例えば

var getStuffAsync = Promise.promisify(getStuff); // Bluebird
var getStuffAsync = Q.denodeify(getStuff); // Q
var getStuffAsync = util.promisify(getStuff); // Native promises, node only

4.ノードスタイルのコールバックを備えたライブラリ全体:

ここには黄金律はありません、あなたはそれらを一つずつ約束します。ただし、一部のPromise実装では、これを一括で実行できます。たとえば、Bluebirdでは、ノードバックAPIをPromiseAPIに変換するのは次のように簡単です。

Promise.promisifyAll(API);

またはノードのネイティブpromiseを使用:

const { promisify } = require('util');
const promiseAPI = Object.entries(API).map(([key, v]) => ({key, fn: promisify(v)}))
                         .reduce((o, p) => Object.assign(o, {[p.key]: p.fn}), {});

ノート:

  • もちろん、.thenハンドラーにいるときは、物事を約束する必要はありません。.thenハンドラーからpromiseを返すと、そのpromiseの値で解決または拒否されます。.thenハンドラーから投げることも良い習慣であり、約束を拒否します-これは有名な約束投げの安全性です。
  • 実際にはonloadaddEventListenerではなくを使用する必要がありますonX
58
efkan 2017-01-03 03:19.

今日、私は使用することができますPromiseNode.jsプレーンなJavascriptの方法として。

PromiseKISSの方法で)簡単で基本的な例:

プレーンなJavascript非同期APIコード:

function divisionAPI (number, divider, successCallback, errorCallback) {

    if (divider == 0) {
        return errorCallback( new Error("Division by zero") )
    }

    successCallback( number / divider )

}

Promise Javascript非同期APIコード:

function divisionAPI (number, divider) {

    return new Promise(function (fulfilled, rejected) {

        if (divider == 0) {
            return rejected( new Error("Division by zero") )
        }

        fulfilled( number / divider )

     })

}

この美しい情報源にアクセスすることをお勧めします

またPromise、と一緒async\awaitに使用してES7、プログラムフローfullfiledに次のような結果を待機させることもできます。

function getName () {

    return new Promise(function (fulfilled, rejected) {

        var name = "John Doe";

        // wait 3000 milliseconds before calling fulfilled() method
        setTimeout ( 
            function() {
                fulfilled( name )
            }, 
            3000
        )

    })

}


async function foo () {

    var name = await getName(); // awaits for a fulfilled result!

    console.log(name); // the console writes "John Doe" after 3000 milliseconds

}


foo() // calling the foo() method to run the code

.then()メソッドを使用した同じコードでの別の使用法

function getName () {

    return new Promise(function (fulfilled, rejected) {

        var name = "John Doe";

        // wait 3000 milliseconds before calling fulfilled() method
        setTimeout ( 
            function() {
                fulfilled( name )
            }, 
            3000
        )

    })

}


// the console writes "John Doe" after 3000 milliseconds
getName().then(function(name){ console.log(name) })

PromiseのようなNode.jsに基づく任意のプラットフォームでも使用できますreact-native

ボーナスハイブリッドメソッド
(コールバックメソッドには、エラーと結果として2つのパラメーターがあると想定されます)

function divisionAPI (number, divider, callback) {

    return new Promise(function (fulfilled, rejected) {

        if (divider == 0) {
            let error = new Error("Division by zero")
            callback && callback( error )
            return rejected( error )
        }

        let result = number / divider
        callback && callback( null, result )
        fulfilled( result )

     })

}

上記のメソッドは、昔ながらのコールバックとPromiseの使用法の結果に応答できます。

お役に立てれば。

35
Siva Kannan 2017-08-12 01:31.

Node.JSでpromiseとして関数を変換する前

var request = require('request'); //http wrapped module

function requestWrapper(url, callback) {
    request.get(url, function (err, response) {
      if (err) {
        callback(err);
      }else{
        callback(null, response);             
      }      
    })
}


requestWrapper(url, function (err, response) {
    console.log(err, response)
})

それを変換した後

var request = require('request');

function requestWrapper(url) {
  return new Promise(function (resolve, reject) { //returning promise
    request.get(url, function (err, response) {
      if (err) {
        reject(err); //promise reject
      }else{
        resolve(response); //promise resolve
      }
    })
  })
}


requestWrapper('http://localhost:8080/promise_request/1').then(function(response){
    console.log(response) //resolve callback(success)
}).catch(function(error){
    console.log(error) //reject callback(failure)
})

複数のリクエストを処理する必要がある場合

var allRequests = [];
allRequests.push(requestWrapper('http://localhost:8080/promise_request/1')) 
allRequests.push(requestWrapper('http://localhost:8080/promise_request/2'))
allRequests.push(requestWrapper('http://localhost:8080/promise_request/5'))    

Promise.all(allRequests).then(function (results) {
  console.log(results);//result will be array which contains each promise response
}).catch(function (err) {
  console.log(err)
});
23
Leo 2015-01-14 18:15.

window.onload@Benjaminによる提案は、ロード後に呼び出されたかどうかを検出しないため、常に機能するとは思いません。何度も噛まれてきました。常に機能するはずのバージョンは次のとおりです。

function promiseDOMready() {
    return new Promise(function(resolve) {
        if (document.readyState === "complete") return resolve();
        document.addEventListener("DOMContentLoaded", resolve);
    });
}
promiseDOMready().then(initOnLoad);
15
Gian Marco 2017-05-31 20:46.

Node.js 8.0.0には、util.promisify()標準のNode.jsコールバックスタイルAPIをPromiseを返す関数でラップできるようにする新しいAPIが含まれています。の使用例をutil.promisify()以下に示します。

const fs = require('fs');
const util = require('util');

const readFile = util.promisify(fs.readFile);

readFile('/some/file')
  .then((data) => { /** ... **/ })
  .catch((err) => { /** ... **/ });

Promisesのサポートの改善を参照してください

14
Bruno 2017-05-16 19:35.

Node.js 8.0.0のリリース候補には、あらゆる機能を約束する能力をカプセル化する新しいユーティリティutil.promisifyutil.promisifyについて書いた)があります。

他の回答で提案されているアプローチと大差ありませんが、コアメソッドであり、追加の依存関係を必要としないという利点があります。

const fs = require('fs');
const util = require('util');

const readFile = util.promisify(fs.readFile);

次にreadFile、ネイティブを返すメソッドがありますPromise

readFile('./notes.txt')
  .then(txt => console.log(txt))
  .catch(...);
7
Apoorv 2016-06-21 03:38.

NodeJSでJavaScriptネイティブPromiseを使用できます。

My Cloud 9コードリンク:https//ide.c9.io/adx2803/native-promises-in-node

/**
* Created by dixit-lab on 20/6/16.
*/

var express = require('express');
var request = require('request');   //Simplified HTTP request client.


var app = express();

function promisify(url) {
    return new Promise(function (resolve, reject) {
        request.get(url, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                resolve(body);
            }
            else {
                reject(error);
            }
        })
    });
}

//get all the albums of a user who have posted post 100
app.get('/listAlbums', function (req, res) {
    //get the post with post id 100
    promisify('http://jsonplaceholder.typicode.com/posts/100').then(function (result) {
        var obj = JSON.parse(result);
        return promisify('http://jsonplaceholder.typicode.com/users/' + obj.userId + '/albums')
    })
    .catch(function (e) {
        console.log(e);
    })
    .then(function (result) {
        res.end(result);
    })
})

var server = app.listen(8081, function () {
    var host = server.address().address
    var port = server.address().port

    console.log("Example app listening at http://%s:%s", host, port)
})

//run webservice on browser : http://localhost:8081/listAlbums
7
daviddavis 2016-11-28 17:07.

昔ながらのバニラJavaScriptを使用して、APIコールバックを約束するソリューションを次に示します。

function get(url, callback) {
        var xhr = new XMLHttpRequest();
        xhr.open('get', url);
        xhr.addEventListener('readystatechange', function () {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    console.log('successful ... should call callback ... ');
                    callback(null, JSON.parse(xhr.responseText));
                } else {
                    console.log('error ... callback with error data ... ');
                    callback(xhr, null);
                }
            }
        });
        xhr.send();
    }

/**
     * @function promisify: convert api based callbacks to promises
     * @description takes in a factory function and promisifies it
     * @params {function} input function to promisify
     * @params {array} an array of inputs to the function to be promisified
     * @return {function} promisified function
     * */
    function promisify(fn) {
        return function () {
            var args = Array.prototype.slice.call(arguments);
            return new Promise(function(resolve, reject) {
                fn.apply(null, args.concat(function (err, result) {
                    if (err) reject(err);
                    else resolve(result);
                }));
            });
        }
    }

var get_promisified = promisify(get);
var promise = get_promisified('some_url');
promise.then(function (data) {
        // corresponds to the resolve function
        console.log('successful operation: ', data);
}, function (error) {
        console.log(error);
});
6
Jason Loveman 2015-04-08 08:30.

kriskowalによるQライブラリには、callback-to-promise関数が含まれています。このような方法:

obj.prototype.dosomething(params, cb) {
  ...blah blah...
  cb(error, results);
}

Q.ninvokeで変換できます

Q.ninvoke(obj,"dosomething",params).
then(function(results) {
});
4
user1852503 2016-08-04 14:45.

コールバックを受け取る関数がいくつかあり、代わりにそれらにpromiseを返したい場合は、この関数を使用して変換を行うことができます。

function callbackToPromise(func){

    return function(){

        // change this to use what ever promise lib you are using
        // In this case i'm using angular $q that I exposed on a util module

        var defered = util.$q.defer();

        var cb = (val) => {
            defered.resolve(val);
        }

        var args = Array.prototype.slice.call(arguments);
        args.push(cb);    
        func.apply(this, args);

        return defered.promise;
    }
}
4
Paul Spaulding 2017-04-13 06:48.

promiseとasyncが組み込まれているノードv7.6 +では、次のようになります。

// promisify.js
let promisify = fn => (...args) =>
    new Promise((resolve, reject) =>
        fn(...args, (err, result) => {
            if (err) return reject(err);
            return resolve(result);
        })
    );

module.exports = promisify;

使い方:

let readdir = require('fs').readdir;
let promisify = require('./promisify');
let readdirP = promisify(readdir);

async function myAsyncFn(path) {
    let entries = await readdirP(path);
    return entries;
}
3
Do Async 2017-10-13 12:19.

Node.js 8では、次のnpmモジュールを使用して、オブジェクトメソッドをその場で約束できます。

https://www.npmjs.com/package/doasync

これは、使用していますutil.promisifyプロキシあなたのオブジェクトがそのままとどまることになります。メモ化WeakMapsを使用して行われます)。ここではいくつかの例を示します。

オブジェクトの場合:

const fs = require('fs');
const doAsync = require('doasync');

doAsync(fs).readFile('package.json', 'utf8')
  .then(result => {
    console.dir(JSON.parse(result), {colors: true});
  });

機能付き:

doAsync(request)('http://www.google.com')
  .then(({body}) => {
    console.log(body);
    // ...
  });

ネイティブcallを使用しapplyて、いくつかのコンテキストをバインドすることもできます。

doAsync(myFunc).apply(context, params)
  .then(result => { /*...*/ });
2
Nicolas Zozol 2017-01-23 03:22.

setTimeoutを処理する例として、ES6でネイティブPromiseを使用できます。

enqueue(data) {

    const queue = this;
    // returns the Promise
    return new Promise(function (resolve, reject) {
        setTimeout(()=> {
                queue.source.push(data);
                resolve(queue); //call native resolve when finish
            }
            , 10); // resolve() will be called in 10 ms
    });

}

この例では、Promiseが失敗する理由がないため、reject()呼び出されることはありません。

2
jituanlin 2017-07-31 03:39.

コールバックスタイルは常にこのような関数(Node.jsのほとんどすべての機能がこのスタイルです):

//fs.readdir(path[, options], callback)
fs.readdir('mypath',(err,files)=>console.log(files))

このスタイルには同じ機能があります。

  1. コールバック関数は最後の引数によって渡されます。

  2. コールバック関数は、最初の引数として常にエラーオブジェクトを受け入れます。

したがって、次のようなスタイルで関数を変換する関数を作成できます。

const R =require('ramda')

/**
 * A convenient function for handle error in callback function.
 * Accept two function res(resolve) and rej(reject) ,
 * return a wrap function that accept a list arguments,
 * the first argument as error, if error is null,
 * the res function will call,else the rej function.
 * @param {function} res the function which will call when no error throw
 * @param {function} rej the function which will call when  error occur
 * @return {function} return a function that accept a list arguments,
 * the first argument as error, if error is null, the res function
 * will call,else the rej function
 **/
const checkErr = (res, rej) => (err, ...data) => R.ifElse(
    R.propEq('err', null),
    R.compose(
        res,
        R.prop('data')
    ),
    R.compose(
        rej,
        R.prop('err')
    )
)({err, data})

/**
 * wrap the callback style function to Promise style function,
 * the callback style function must restrict by convention:
 * 1. the function must put the callback function where the last of arguments,
 * such as (arg1,arg2,arg3,arg...,callback)
 * 2. the callback function must call as callback(err,arg1,arg2,arg...)
 * @param {function} fun the callback style function to transform
 * @return {function} return the new function that will return a Promise,
 * while the origin function throw a error, the Promise will be Promise.reject(error),
 * while the origin function work fine, the Promise will be Promise.resolve(args: array),
 * the args is which callback function accept
 * */
 const toPromise = (fun) => (...args) => new Promise(
    (res, rej) => R.apply(
        fun,
        R.append(
            checkErr(res, rej),
            args
        )
    )
)

より簡潔にするために、上記の例ではramda.jsを使用しました。Ramda.jsは、関数型プログラミングのための優れたライブラリです。上記のコードでは、apply(javascriptのようにfunction.prototype.apply)とappend(javascriptのようにfunction.prototype.push)を使用しました。したがって、コールバックスタイル関数をpromiseスタイル関数に変換できます。

const {readdir} = require('fs')
const readdirP = toPromise(readdir)
readdir(Path)
    .then(
        (files) => console.log(files),
        (err) => console.log(err)
    )

toPromiseおよびcheckErr関数はberserkライブラリが所有しており、ramda.js(私が作成)による関数型プログラミングライブラリフォークです。

この回答がお役に立てば幸いです。

2
onmyway133 2018-10-10 03:35.

あなたはこのようなことをすることができます

// @flow

const toPromise = (f: (any) => void) => {
  return new Promise<any>((resolve, reject) => {
    try {
      f((result) => {
        resolve(result)
      })
    } catch (e) {
      reject(e)
    }
  })
}

export default toPromise

その後、それを使用します

async loadData() {
  const friends = await toPromise(FriendsManager.loadFriends)

  console.log(friends)
}
1
Pujan 2017-10-18 13:56.

es6-promisify コールバックベースの関数をPromiseベースの関数に変換します。

const promisify = require('es6-promisify');

const promisedFn = promisify(callbackedFn, args);

参照:https//www.npmjs.com/package/es6-promisify

1
loretoparisi 2017-11-30 13:34.

私の約束したcallback関数のバージョンは次の関数ですP

var P = function() {
  var self = this;
  var method = arguments[0];
  var params = Array.prototype.slice.call(arguments, 1);
  return new Promise((resolve, reject) => {
    if (method && typeof(method) == 'function') {
      params.push(function(err, state) {
        if (!err) return resolve(state)
        else return reject(err);
      });
      method.apply(self, params);
    } else return reject(new Error('not a function'));
  });
}
var callback = function(par, callback) {
  var rnd = Math.floor(Math.random() * 2) + 1;
  return rnd > 1 ? callback(null, par) : callback(new Error("trap"));
}

callback("callback", (err, state) => err ? console.error(err) : console.log(state))
callback("callback", (err, state) => err ? console.error(err) : console.log(state))
callback("callback", (err, state) => err ? console.error(err) : console.log(state))
callback("callback", (err, state) => err ? console.error(err) : console.log(state))

P(callback, "promise").then(v => console.log(v)).catch(e => console.error(e))
P(callback, "promise").then(v => console.log(v)).catch(e => console.error(e))
P(callback, "promise").then(v => console.log(v)).catch(e => console.error(e))
P(callback, "promise").then(v => console.log(v)).catch(e => console.error(e))

このP関数では、コールバック署名がである必要がありますcallback(error,result)

1
Mzndako 2019-06-22 00:38.

以下は、関数(コールバックAPI)をpromiseに変換する方法の実装です。

function promisify(functionToExec) {
  return function() {
    var array = Object.values(arguments);
    return new Promise((resolve, reject) => {
      array.push(resolve)
      try {
         functionToExec.apply(null, array);
      } catch (error) {
         reject(error)
      }
    })
  }
}

// USE SCENARIO

function apiFunction (path, callback) { // Not a promise
  // Logic
}

var promisedFunction = promisify(apiFunction);

promisedFunction('path').then(()=>{
  // Receive the result here (callback)
})

// Or use it with await like this
let result = await promisedFunction('path');

1
Josiah Nyarega 2020-09-25 08:28.

未来から😄

私が普段使っている単純なジェネリック関数。

const promisify = (fn, ...args) => {
  return new Promise((resolve, reject) => {
    fn(...args, (err, data) => {
      if (err) {
        return reject(err);
      }
      resolve(data);
    });
  });
};

それを使用する方法

   promisify(fn, arg1, arg2)

あなたはおそらくこの答えを見ていませんが、これは利用可能なユーティリティの内部の仕組みを理解するのに役立ちます

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