web-dev-qa-db-ja.com

returnキーワードなしで非同期関数を解決することは可能ですか?

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に直接アクセスする必要がないため、コードを完全にタスクに集中させることができます。

14
rokstar

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
        });
    });
}
_
14
Bergi

関数から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();
}
0
Ali

非同期関数を作成し、それを呼び出すときに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; 
  })
0
ariel guzman