2016-11-09 8 views
7

私は非同期タスクを処理する最良の方法を提供するES7機能async/awaitを使い始めました。返信キーワードなしで非同期関数を解決することは可能ですか

ただし、非同期関数で作成された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); 
    }); 
} 

この方法では、関数によって作成された約束へのポインタを見つけることができれば何

async function doStuff() { 
    //stuff... 
    var value = await new Promise(function(resolve) { 
     $.get('http://some/url/...', function(result) { 
      // stuff... 
      resolve(result); 
     }); 
    }); 
    return value; 
} 

はので、あなたのコードは次のようになります。私はこのことを意味しますPromises APIに直接アクセスする必要はありません。なぜなら、あなたのコードはタスクに完全に焦点を当てています。

+1

私はあなたが 'async' /' await'のポイントを見逃していると思っています。単純に 'result = await $ .get(someUrl);を実行するシナリオを作成できますか? doStuffWith(result) 'で十分ではありませんか?提案の全体のポイントは、コールバックを処理する必要はありません。 – Amadan

+0

私はあなたがすでに約束しているのであれば、なぜ別のものを作成する必要があるのか​​と思っただけです。下のBergiは明確に答えました - いいえ=) – rokstar

答えて

11

それが本当にそこにありasync functionへの呼び出しが作成した約束への参照を取得する方法はありませんが、returnキーワードなし

を非同期機能を解決することは可能ですそれにアクセスする必要はありません(とbtw、あなたは約束をすることができません.resolve()、実際には、約束の解決機能にアクセスする必要があります)。

async/awaitの全体のポイントは、約束や他の人物でうまくいくことです。考えられるのは、の非同期関数はすべて約束を返し、何かを約束する必要はありませんが(実際に行う必要がある場合は、別途行う必要があります)、実際には$.getです。あなたが本当にコールバック・撮影機能を持っているのであれば、単純に使用し、

async function doStuff() { 
    //stuff... 
    var result = await $.get('http://some/url/...'); 
    // stuff... 
    return value; 
} 

を書く簡単な

関数は非同期であるためには必要はありませんあなたが関数から約束を返している
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 
     }); 
    }); 
} 
0

実際には2つの約束事を作っているので悪いことです!

function doStuff() { 
    return new Promise(function(resolve, reject) { 
     $.get('http://some/url/...', result => resolve(result)); 
    }); 
} 

async function main() { 
    const result = await doStuff(); 
} 
関連する問題