2017-08-10 15 views
0

私は約束事を扱う際に問題があります。 最初はこのように機能を設定していましたが、問題なく動作しました。非同期/プロミス保留中エラーが発生する

オリジナル:

const request = require("request-promise"); 
async() => { 
    const URL_HIDDEN = "..."; 

    let info = await request(URL_HIDDEN); 
    info = JSON.parse(info).response.players[0]; 

    let playtime = await request(URL_HIDDEN); 
    playtime = JSON.parse(playtime).response.games; 

    console.log(info); 
    console.log(playtime); 
} 

これは短縮バージョンですが、基本的に私はちょうどスチームAPIから情報を要求しています。どちらの変数もすべてのデータが問題なく印刷されますが、以下のリファクタを実行するとその変数が変わります。

はリファクタリング:

const middleware = require("../middleware"); 
async() => { 
    const URL_HIDDEN = "..."; 

    let requests = middleware.requestURI(URL_HIDDEN); 
    console.log(requests); 
} 

と私は別のファイルに別の関数で扱うすべての要求を始めました。

const request = require("request-promise"); 
middlewareObj.requestURI = async (URL_HIDDEN) => { 
    console.log("1"); 
    let info = await request(URL_HIDDEN); 
    info = JSON.parse(info).response.players[0]; 

    console.log("2"); 

    let playtime = await request(URL_HIDDEN); 
    playtime = JSON.parse(playtime).response.games; 

    console.log("3"); 

    return [{ info }, { playtime }]; 
}; 

すべての変数をソートしたら、配列を返すようにします。しかし、一度実行すると、これはコンソールに表示されます。

1 
Promise { <pending> } 
2 
3 

私はそれをリファクタリングたら、それは保留中の約束を印刷している理由の任意のアイデア?元に

が、それはあなたの "リファクタリング" のコードで

+0

かかわらず、この不自然な例では、それは明らかではありませんので、何の問題? – Ivan

+1

配列に実際に何が記録されているのではなく、約束を保留しています。配列 – Phillip

+1

の各変数には多くの情報があります。 'requestURI'は' async'で 'console.log(要求)'が実行された時点では完了していないからです。 – Ivan

答えて

2

完全に罰金すべて出力します - awaitなし

let requests = middleware.requestURI(URL_HIDDEN); 

を、requestsは保留中のお約束になります - ので、あなたが必要

let requests = await middleware.requestURI(URL_HIDDEN); 

これを拡張します。 asyncとタグ付けされた関数はPromiseを返します。バーで

let bar = foo(); 
// here bar = pending promise of foo() 

結果が

let bar = await foo(); 
// here bar == true 

のようにそれを呼び出す約束

いるようにこれを呼び出す

async function foo() { 
    return true; 
} 

は同等のソート(しかし、どこにも等しく近い)である

foo().then(bar => { 
    // here bar == true 
}) 

async/awaitすでに約束のことで簡素化されたコードでも簡単にすることができます -

+0

私は知らなかった私は要求を処理するために呼び出されている関数を待たなければならなかった。お役立ち情報 – Phillip

+0

ありがとうございました:) – Phillip

関連する問題