2015-06-19 2 views
0

Возможно, я немного новичок, чтобы понять основное функционирование обещаний esp bluebird. То, что я пытаюсь выполнить, - это сервер API, который обрабатывает массовую запись строк 250K + в базу данных. Чтобы выполнить запрос, требуется около 30 секунд. Я хочу, чтобы сервер API вернул ok или ошибку, основываясь на успехе массовой записи. Когда я не использую обещания, я не получаю возможность выпустить ошибку, потому что запрос не ждет завершения массовой записи. Однако, если я использую обещание, ошибка и успех будут работать правильно. Но сервер перестает отвечать, пока действие не будет завершено. В двух словах, используя библиотеку обещаний для обработки массовой записи, блокирует сервер API.Являются ли bluebird обещаниями, блокирующими в природе

function chunk(arr, chunkSize) { 
    var R = []; 

    for (var i=0,len=arr.length; i<len; i+=chunkSize) 
    { 
     R.push(arr.slice(i,i+chunkSize)); 
    } 
    return promise.resolve(R); 
} 


exports.add = function(req, res) { 
var PO_STD_LT_TIME = 90; //DAYS 
    Parts.sync() 
     .then(function() { 
      return Parts.destroy({ 
       where: {} 
      }); 
     }) 
     .then(function() { 
      var workbook = XLSX.readFileSync(__dirname + '/dbo_tblCPLParts_.xlsx'); 
      var sheet_name_list = workbook.SheetNames; 
      var JSON_S = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]); 

      var size = 40000; 
      chunk(JSON_S, size).then(function(JSON_Small) { 
       promise.each(JSON_Small, function (JSON_small_){ 
        Parts.bulkCreate(JSON_small_) 
        .catch(function(err) { 
         res.json(500, { 
          Error: "Error : " + err 
         }); 
        }) 

       }).finally(ext_fns.handleResult(res,200)) 
      }) 
      }) 

} 

Каков наилучший способ справиться с этим? Я использую обещание правильно?

+0

все js блокировка (за исключением комплектTimeout/промежуток). только хозяин может предоставить возможность сделать перерыв. – dandavis

+0

Предположительно, задача всегда занимала 30 секунд, но перед обещанием вы не знали. –

ответ

1

Это потому, что вы вызываете синхронное поведение на этом пути. Виной

var workbook = XLSX.readFileSync(__dirname + '/dbo_tblCPLParts_.xlsx'); 

Вы должны вместо этого использовать XLSX эквивалент fs.readFile, который является асинхронным. С другой стороны, так как вы используете Bluebird, вы можете использовать promisifyAll на XLSX модуле:

var Promise = require('bluebird') 
var fs = Promise.promisifyAll(/* the XLSX module */) 

, который позволит вам лечить все модули XLSX, как обещания.

+0

Спасибо, что указали это. К сожалению, модуль XLSX внутренне использует fs.readfileSync. Я попытался преобразовать его, но он не работает. Наверное, мне нужно изучить дочерний процесс и другие материалы для параллельной обработки. –

+0

@ UmaMaheshwaraa есть ли асинхронные версии модуля xlsx? – royhowie

+0

нашел одну, но другую библиотеку. нужно выяснить, работает ли это для моей цели. –

1

Это протап.

В io.js (NodeJS) недавно был добавлен синхронный флаг io. Выполните самую последнюю версию и запустите ее с помощью --trace-sync-io. Это выяснит все ваши синхронные проблемы с блокировкой - я подозреваю, что они не являются обещаниями.

Что касается синей птицы - она ​​не блокирует.

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