2017-01-23 16 views
1

試し印刷Promise { <pending> }と第2の試し印刷の両方がUnhandled Promise Rejection Warningです。 .thenと.catchを使ってPromisesを使用して成功しましたが、async/awaitを使用して、より同期的な方法でコード化したいものがいくつかあります。おそらく私は代わりに収量を使用すべきですか?非同期での使用とエラー処理の苦闘

try { 
    var tokens = getNewTokens('refresh-token', 1) 
    console.log(tokens) 
} catch (error) { 
    console.log(error.message) 
} 

try { 
    tokens = getNewTokens('no-such-refresh-token', 1) 
    console.log(tokens) 
} catch (error) { 
    console.log(error.message) 
} 

function getRefreshToken (refreshToken, userId) { 
    return new Promise((resolve, reject) => { 
    if (refreshToken === 'refresh-token' && userId === 1) { 
     return resolve({ 
     refreshToken: 'refresh-token', 
     accessToken: 'jwt' 
     }) 
    } else { 
     const error = Error('Refresh token not found') 
     return reject(error) 
    } 
    }) 
} 

async function getNewTokens (refreshToken, userId) { 
    if (!refreshToken || !userId) { 
    throw Error('Missing params') 
    } 
    try { 
    var result = await getRefreshToken(refreshToken, userId) 
    } catch (error) { 
    throw Error(error.message) 
    } 
    if (!result) { 
    throw Error('Something went bonk') 
    } 
    // Do stuff.. 
    // get user from DB 
    // update refresh token with a new one 
    // make new jwt 
    return { 
    user: { 
     id: 1, 
     name: 'Jerry', 
     role: 'admin' 
    }, 
    newRefreshToken: 'new-refresh-token', 
    newAccessToken: 'new-jwt' 
    } 
} 

答えて

13

asyncawaitを使用すると、プログラム全体を非同期になりません。それは特定の機能を非同期にします。最後に、asyncは、約束しやすいコードを書くのを容易にする構文的な砂糖です。

async関数は、Promiseを返します。非同期関数を呼び出すコードは、それを約束を返す関数として扱わなければなりません。 (async関数を呼び出しているコードは、それがawait EDすることができ、その場合async機能、自体とき唯一の例外である。)

だからErrorPromise拒絶に翻訳されます投げます。エラーがスローされる前にtry..catchが途中であるという単純な理由のために、try..catchブロックでそれをキャッチすることはできません! (また、async関数から呼び出すときは例外です。非同期関数をawaitにすると、try..catchブロックが機能します。この場合、try..catchブロックはPromise#catch関数を追加しているかのように扱われます)。

あなたは最終的には通常のPromise#catch方法を使用してasync機能から、あるいはPromise#thenの2番目の引数でエラーをキャッチする必要があります。

getNewTokens('no-such-refresh-token', 1) 
    .then(function(tokens) { 
     console.log(tokens); 
    }, function(error) { 
     console.log(error.message); 
    }); 
0

初心者のための実用的な答えを非同期に/待って、エラーが

を扱います

あなたはは、その前に非同期そうなどと宣言されていない関数の外側構文を待って使用することはできません...

async function myAsyncFunction() { 
    // code 
} 

だから、最終的には、古い約束を使用する必要がそれは約束であるため、機能を消費する方法は非同期

myAsyncFunction().then(() => console.log('here')); 

として宣言しました。今

あなたがにするために使用されているように、実際にエラーを処理するために、その後 - キャッチ方法、あなたは、あなたがこのように使用することができますので...

async function getUser(username) { 
    try { 
    return await db.users.get({ username }); 
    } catch (err) { 
    return Promise.reject(err); 
    } 
} 

のようなあなたの非同期機能を構築する必要がありますそのような非同期メソッドの外で、通常の約束...

getUser() 
.then(user => console.log(user)) 
.catch(err => console.error(err)); 

またはあなたは、それを推測のawait使用して非同期関数内でそれを使用します。

async function getJoffery() { 
    try { 
    return await getUser('joffery'); 
    } catch (err) { 
    return Promise.reject(err); 
    } 
} 
関連する問題