ES7の機能を使い始めましたasync/await
は、非同期タスクを処理するための最良のアプローチを提供し、コードをよりクリーンで読みやすくします。
ただし、async関数によって作成されたPromiseへのアクセスは提供されないため、async関数で非同期リクエストを実行する場合は、それを約束し、それを待ってから結果を返す必要があります。私はこれを意味します:
async function doStuff() {
//stuff...
var value = await new Promise(function(resolve) {
$.get('http://some/url/...', function(result) {
// stuff...
resolve(result);
});
});
return value;
}
関数によって作成されたPromiseへのポインターを見つけて、コードが次のようになるとしたらどうでしょう。
async function doStuff() {
//stuff...
var p = arguments.callee.promise;
$.get('http://some/url/...', function(result) {
// stuff...
p.resolve(result);
});
}
あるいは:
async function doStuff() {
//stuff...
$.get('http://some/url/...', function(result) {
// stuff...
async.resolve(result);
});
}
この方法では、Promises APIに直接アクセスする必要がないため、コードを完全にタスクに集中させることができます。
Returnキーワードなしで非同期関数を解決することは可能ですか?
番号。
_async function
_の呼び出しによって作成されたpromiseへの参照を取得する方法はありませんが、実際にそれにアクセスする必要はありません(そして、あなたは.resolve()
promiseを使用できません。実際には、promiseの解決機能にアクセスする必要があります)。
async
/await
の要点は、約束や他の賛成論でニースを演じることです。アイデアはevery非同期関数がpromiseを返すこと、そして何かを約束する必要はないということです(ただし、本当に必要な場合は個別に行う必要があります)-実際、_$.get
_ does(jQuery)promiseを返します。だから単に書く
_async function doStuff() {
//stuff...
var result = await $.get('http://some/url/...');
// stuff...
return someValue;
}
_
本当にコールバックを取る関数がある場合は、単純な
_async function doStuff() {
// stuff…
return new Promise(function(resolve, reject) {
$.get({
url: 'http://some/url/...',
success: resolve,
error: reject
// don't do other "stuff" in here
});
});
}
_
関数からpromiseを返す場合、関数を非同期にする必要はありません。実際には、2つのpromiseを作成しているため、さらに悪いことになります。
function doStuff() {
return new Promise(function(resolve, reject) {
$.get('http://some/url/...', result => resolve(result));
});
}
async function main() {
const result = await doStuff();
}
非同期関数を作成し、それを呼び出すときにawaitを使用するのはどうでしょう。
//define
async promiseFunction(foo) {
return otherPromiseFunction(foo);
async promiseFunction2(foo) {
return '10';
}
async promiseFunction3(foo) {
return new Promise((resolve, reject) => {
resolve('foo')
})
}
//invoke
anotherPromiseFunction(bar).then(async foo => {
const fooResult = await promiseFunction(foo);
return fooResult;
})