2017-02-15 16 views
2

火焰警報如何明確完成一個承諾在Node.js的

它是如此簡單:我超熟悉Java completable期貨:

CompleteableFuture f = CompleteableFuture.supplyAsync(() -> "Hello").thenApply(s -> s.concat(" world")) 

該代碼可以後跟:

CompleteableFuture word1 = f.thenApply(s -> s + " I am a completable future"); // "Hello world I am a completable future" 
CompleteableFuture word2 = f.thenApply(s -> s + " I am teapot"); // "Hello world I am a teapot" 
// option 1 (non blocking): 
word1.thenAccept(System.out::println); 
// option 2 (Blocking) 
System.out.println(word1.get()); 

現在的Node.js:

const f = new Promise((resolve,reject) => { 
    return resolve('Hello') 
}).then(s => " world") 
const word1 = f.then(s => s + ' I am a promise') // 'Hello world I am a promise' 
const word2 = f.then(s => s + ' I am a teapot') // 'Hello world I am a teapot' 

// option 1 (non blocking) 
word1.then(console.log) 
// option 2 (Blocking) 
console.log(word1.???????) 

節點js的'option 2'在哪裏?沒有這個,我不得不創建一個閉包來更新一個簡單的值而不是返回。

我寧願有人說'你不知道你在說什麼',並告訴我,然後讓我的無知堅持下去。

+1

node.js沒有辦法使非阻塞異步操作突然變爲阻塞和同步。它不這樣做。這是一個事件驅動的環境,幾乎所有的I/O都是非阻塞和異步的。要使用node.js環境,您可以使用它編程。而且,通過指定'p.then()'總是異步的。即使'p'已經解析,'.then()'處理程序總是會在事件循環的某個未來時刻被調用。 – jfriend00

回答

3

您可以使用Promise.resolve(),立即返回履行的承諾。

Promise.resolve("Hello") 
    .then(s => console.log(s + " world")); // Outputs "Hello world" 

如果您想立即拒絕承諾,也有Promise.reject()

Promise.reject("Hello") 
    .then(s => console.log(s + " world")) 
    .catch(s => console.log(s + " mars")); // Outputs "Hello mars" 

但是,據我所知,不可能像你所描述的那樣以同步/阻塞的方式從Promise中得到結果。最接近的功能是async/await,其中isn't widely supported剛好還沒有同步。它只是允許類似的語法來同步調用。這將允許你寫這樣的函數:

async function returnString() { 
    let s = await Promise.resolve("Hello").then(s => s + " world"); 
    console.log(s); // Outputs "Hello world" 
} 

returnString(); 

a library它允許你有什麼本質上是一個異步/等待填充工具。

異步/等待是Node.js的7.3+與--harmony flag,這使得不被視爲穩定的,只是還沒有上演功能supported natively和8.0+沒有標誌,並認爲外,它可以與Babel被transpiled成爲可在更多環境中使用的東西。

+2

供參考。 async/await只是告訴解釋器自動包裝在'.then()'處理程序中的代碼。這是一種語法方便。在使用async/await時,以前異步和非阻塞的所有內容仍然是異步和非阻塞的。而且,如果您現在想要使用async/await,則可以使用BabelJS來編譯代碼。 – jfriend00

+0

啊,謝謝澄清@ jfriend00我會確保在我的答案中清楚。 –

+0

如何在不使用babel transpile的情況下執行'async'' await'操作?使用承諾是偉大的,但在某些時候你必須知道它已經完成。 –