2017-09-24 15 views
2

を終了する約束を待っていない待つ:非同期は/私はこのポストルートを持っている

app.post("/new", async (req, res) => { 
    const Lob = require("lob")({ apiKey: keys.LOB_API }); 

    let toAddress = await lobFuncs.toAddress(req.body.addrLine1, Lob); 

    console.log("test"); 
    }); 

toAddress()関数は次のようになります。

toAddress: async (address, Lob) => { 
    await this.parseGoogleCiv(address, obj => { 
     console.log(obj); 
    }); 
    }, 

parseGoogleCiv: async (address, callback) => { 
    address = address 
     .trim() 
     .split(" ") 
     .join("%20"); 

    let URL = "some long URL" 

    await request(URL, function(err, res) { 
     if (err) { 
     console.log(err); 
     } else { 
     let body = JSON.parse(res.body); 
     callback(body); 
     } 
    }); 
    } 

しかし、これは私の出力である...

test 
body 

"test"出力は、本体出力の後に来る必要があります。

質問: ここでは何が起こっていますか?私の知る限りでは、私は約束が間違っていないので、私はすべての非同期/正しく見ることを待っていると思う。何か案は?

+4

末尾に 'リクエスト()'メソッドがコールバックを取る、それはそう、それは戻りません。それは基本的に効果がない前に '約束する'と約束します。 – Sirko

+3

そこには '要求'の約束されたバージョンがあります。それを使用して、そのコールバックを殺す... –

+0

あなたの応答に感謝! – Phillip

答えて

3

問題は、基本的にparseGoogleCiv関数で何も待たないことです。やることがあります。

parseGoogleCiv: async (address) => { 
    address = address 
    .trim() 
    .split(" ") 
    .join("%20"); 

    let URL = "some long URL" 

    try { 
    return JSON.parse(
    (await new Promise((resolve,rej) => request(URL, function(err, res) { 
     if(err) return rej(err); 
     resolve(res); 
     }))).body 
    ); 
    } catch(err){ 
    console.log(err); 
    } 
} 

あなたがpromisified request versionを使用する場合、これはおそらくよりエレガントです:

parseGoogleCiv(address){ 
    address = address 
    .trim() 
    .split(" ") 
    .join("%20"); 

const url = "someurl"; 

return request(url) 
    .then(res => JSON.parse(res.body)) 
    .catch(err => console.log(err)); 
} 
+0

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

関連する問題