2017-09-24 181 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 

「測試」輸出應出現在主體輸出之後。

問題: 這是怎麼回事?據我所知,我認爲我做了所有的異步/等待正確看到,因爲我沒有收到承諾錯誤。有任何想法嗎?

+4

了'請求()'方法在年底採用了回調,這樣看來,它不返回承諾,因此,在它基本上沒有效果之前,「等待」權利。 – Sirko

+3

Theres是那裏'request'的promisified版本。使用它並殺死那個回調... –

+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