2016-04-26 124 views
1

糾正我,如果我在這裏錯了。這是我做的在Nodejs中使用redis和bluebird的異步等待

client = Promise.promisifyAll(redis.createClient()) 
let reply = await client.getAsync('foo_rand000000000000') 
console.log('reply',reply.toString()) 

而我得到了Unexpected token錯誤。

我有這個在我.babelrc

{ 
    "presets": [ 
    "es2015", 
    "stage-3" 
    ] 
} 

有人能指出我做錯了什麼在這裏。

+2

你把該代碼添加一個'異步函數中進一步解釋'? – Bergi

+0

@Bergi這是錯的。謝謝。你能否讓它成爲答案,我會接受它。你也可以解釋爲什麼我必須這樣做嗎? –

回答

5

由於@Bergi指出的那樣,你需要包裝,在一個異步函數

client = Promise.promisifyAll(redis.createClient()) 

async function main() { 
    let reply = await client.getAsync('whatever'); 
    console.log('reply', reply.toString()); 
} 

main(); 

要擴大一點,如果你看一下這個文檔http://babeljs.io/docs/plugins/transform-async-to-generator/你會發現,他們正在做的是轉換函數發送到生成器併產生對變量reply的承諾的解析值。如果沒有在可以轉換爲生成器的函數中包裝這個函數,那麼您將無法暫停執行,因此無法完成此操作。

另外,應該指出,這不是標準的一部分。它可能不會消失,但API可能會改變。所以我不會使用這個,除非這是一個玩具項目。您可以使用coBluebird.coroutine完成類似的操作。他們是不是很美觀,但是API不會改變和重構一次異步/ AWAIT得到標準化將是微不足道的

編輯:

+1

這已實施到ECMA262的規範中:https://github.com/tc39/ecma262/pull/692 – JCM