2015-02-27 4 views
0

Я надеюсь, что кто-то, кто использует Q module в Node.js, может мне посоветовать.Node.JS - Q Module - Promises

Итак, мой вопрос:

Это, как правило, необходимо создать более одного promise, если вы пытаетесь выполнять несколько функций в последовательности?

Например, я пытаюсь создать приложение, которое:

1) Read data from a file (then) 
2) Opens a database connection (then) 
3) Executes a query via the database connection (then) 
4) Store JSON dataset to a variable (then) 
5) Close Database connection. (then) 
6) Perform other code base on the JSON dataset I've stored to a variable. 

В сыром Node.js, каждый метод объекта ожидает обратный вызова, и для того, чтобы сделать эти задачи в правильном порядке (а не одновременно, что бы не сработало), мне нужно связать эти обратные вызовы вместе, используя уродливое количество вложенности кода.

Я обнаружил Q module, что предотвращает вложение через концепцию Promise.

Однако, в моей первой попытке использовать Q, я пытаюсь сделать обещание из всего, и я думаю, что я мог бы слишком усложнять свой код.

Я думаю, что, возможно, вам действительно нужно создать один объект обещания для выполнения описанных выше шагов и что для меня может быть ненужным преобразовать каждый метод в обещание с помощью метода Q.denodeify.

Например, в моем коде я буду подключаться к базе данных db2 с помощью модуля ibm_db. Вероятно, из-за непонимания, я конвертируются все методы IBM_DB обещаниям так:

var ibmdb = require('ibm_db'); 
var q = require('q'); 
var ibmdbOpen = q.denodeify(ibmdb.open); 
var ibmdbConn = q.denodeify(ibmdb.conn); 
var ibmdbClose = q.denodeify(ibmdb.close); 
var ibmdbQuery = q.denodeify(ibmdb.query); 

Является ли это действительно необходимо?

Для того, чтобы сделать одну вещи после других в Q, является необходимым для меня denodeify каждого метода, который я буду использовать в моем сценарии?

Или я могу просто создать одно обещание в начале скрипта и использовать метод q.then для выполнения всех асинхронных функций в последовательности (без блокировки).

+1

Если вы собираетесь использовать обещания, то да, это имеет смысл сделать генераторную обещание функции для каждого. Вы также можете изучить асинхронную библиотеку в качестве альтернативы обещаниям (https://github.com/caolan/async), хотя я лично предпочитаю обещания. –

ответ

0

Как правило, необходимо создать несколько обещаний, если вы пытаетесь выполнить несколько функций в последовательности?

Да, окончательно. Если у вас не было обещаний для всех промежуточных шагов, вам придется использовать обратные вызовы для них - это именно то, чего вы пытались избежать.

Я пытаюсь сделать обещание из всего

Это должно работать нормально. Действительно, вы должны попытаться обещать на самом низком возможном уровне - rule - это обещание для всего, что является асинхронным. Однако нет никаких оснований делать обещания для синхронных функций.

Особенно ваши шаги 4 и 5 беспокоят меня. Хранение чего-то в переменной вряд ли нужно, когда у вас есть обещание - можно даже считать это антипаттерном.И действие базы данных close не должно идти в обработчике then - вместо этого оно должно выполняться в обработчике finally.

Я бы рекомендовал не использовать линейную цепочку, а скорее:

readFile(…).then(function(fileContents) { 
    return ibmdbOpen(…).then(function(conn) { 
     return imbmdbQuery(conn, …).finally(function() { 
      return imbdbClose(conn); 
     }); 
    }).then(function(queriedDataset) { 
     … 
    }); 
}); 
Смежные вопросы