2017-02-14 4 views
0

Я пытаюсь понять, как работает promisifyAll. я стараюсь понять пример, приведенный в их документации. Может кто-нибудь, пожалуйста, дайте мне простой пример, как это работает? Я пытаюсь понять концепцию и то, как мы можем ее использовать. СпасибоpromisifyВсе в bluebird.js

var objects = {}; 

objects.first = function(){ 
    console.log("First one is executed"); 
} 

objects.second = function(){ 
    console.log("second one is executed"); 

} 

objects.third = function(){ 
    console.log("third one is executed"); 
} 

Как мы можем обелить переменную объектов? или что-то типа того.

+0

Можете вы добавить ссылку на документацию? – Gpx

+0

У вас нет ** callback ** на ваших объектных функциях, поэтому не имеет смысла обещать. Promisify используется, когда у вас есть стиль обратного вызова, и вы хотите работать с ним в качестве обещания. Лучше сказать, чего вы хотите достичь, чтобы дать лучший совет. – Hosar

+0

Если в коде нет ничего асинхронного, вы не можете его обещать. – Bergi

ответ

2

Во-первых, вам нужно понять, как работает nodeFunction. В качестве последнего аргумента требуется функция обратного вызова. Этот обратный вызов принимает два аргумента, первый - error, а второй - данные. Рассмотрим, например require("fs").readFile:

// This is the callback 
function callback (error, data) { 
    if (error) { 
    console.error('There was an error', error) 
    } else { 
    console.log('This is the data', data) 
    } 
} 
require('fs').readFile('my-file.txt', callback) 

Обратите внимание, что это соглашение, нет ничего в самом JS, что усиливает его.

Перейдем к Promise.promisify сейчас. Этот метод принимает nodeFunction и возвращает его версию. Это более или менее то, что он делает:

function promisifiedReadFile (filePath) { 
    return new Promise(function (fulfill, reject) { 
    require('fs').readFile(path, function (error, data) { 
     if (error) { reject(error) } else { fulfill(data) } 
    }) 
    }) 
} 

Это немного многословным, но как вы можете видеть, теперь у вас есть версия readFile, которая возвращает обещание вместо принятия обратного вызова. Конечно, этот пример жестко закодирован для readFile, Promise.promisify работ для любого nodeFunction вместо:

const promisifiedReadFile = Promise.promisify(require('fs').readFile) 

Два promisifiedReadFile методов работают таким же образом.

Последнее, Promise.promisifyAll принимает объект, проходит через него и находит все методы, затем применяет Promise.promisify к каждому из них.

Итак, если вы позвоните Promise.promisifyAll(require('fs')), вы получите версию модуля fs, где все методы возвращают обещания вместо принятия обратных вызовов.


О вашем примере я не уверен, что вы пытаетесь достичь, но методы, которые вы указали не nodeFunctions, поэтому они не могут быть promisified.

+0

Спасибо большое, я загляну в это –

+0

Стоит отметить, что 'promisifyAll' * мутирует * объект, который вы передаете ему. Кроме того, он будет добавлять методы с суффиксом 'Async',' fs.readFile() 'становится' fs.readFileAsync() ', хотя исходный' fs.readFile() 'будет по-прежнему доступен под тем же именем. –

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