2017-02-15 3 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.???????) 

Где эта опция 2 для узла js? Без этого я вынужден создать закрытие для обновления простого значения вместо возврата.

Я бы предпочел, чтобы кто-то сказал: «Вы не знаете, что вы говорите», и покажите мне, затем позвольте моему невежеству упорствовать.

+1

У node.js нет способа сделать неблокирующую асинхронную операцию suddently становиться блокирующей и синхронной. Это не так. Это среда, управляемая событиями, где почти все операции ввода-вывода не блокируются и асинхронны. Чтобы использовать среду node.js, как вы ее программируете. И, по спецификации 'p.then()' всегда async. Обработчик '.then()' всегда будет вызываться на какой-либо будущий тик цикла событий, даже если 'p' уже разрешен. – 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, которая позволяет вам, что по сути является асинхронным/polyfill ждет.

асинхронной/ждут в Node.js 7.3+ с --harmony flag, что позволяет постановочные особенности, которые не считаются стабильными только пока supported natively и 8.0+ без флага, и за ее пределами, что это может быть transpiled с Babel во что-то, что можно использовать в большей среде.

+2

FYI. async/await просто говорит интерпретатору автоматически обернуть код, который следует в обработчике '.then()' для вас. Это удобство синтаксиса. Все, что было асинхронно и не блокировалось ранее, все еще асинхронно и не блокируется при использовании async/await. И, если вы хотите использовать async/wait now, вы можете перекопировать свой код с помощью BabelJS. – jfriend00

+0

Ahh, спасибо за разъяснение @ jfriend00 Я сделаю так, чтобы это было ясно в моем ответе. –

+0

Как я могу сделать это 'async'' await' без использования пересылки babel? Использование обещания велико, но в какой-то момент вы должны знать, что это сделано. –

Смежные вопросы