2017-04-04 54 views
0

我想實現下面的步驟在node.js中想在node.js中

  • 順序可以放置和使用我的REST的API支付兩個紗線之間傳遞引用。
  • 一旦訂單狀態從PLACED改變爲PAID,將排隊的順序在隊列數據結構。
  • 一個單獨的線程持續運行以檢查隊列中是否有順序。如果隊列中有命令,則它將被出隊並開始到準備好,已服務已收集。在這裏,隊列中可能有很多訂單,或根本沒有。

我分享我的代碼在這裏

//order.js

var Queue = require('queuejs'); 
var queue = new Queue(); 
queue.enq("hello"); 
const threads = require('threads'); 
const spawn = threads.spawn; 
const thread = spawn(function(){}); 

exports.payOrder = function (req, res) { 

    //after changing order status to PAID in database, I enq it in queue. 
    queue.enq(id); 
}; 
exports.processOrder = function() { 
    spawn("./routes/helper.js").send(); 
}; 
exports.queue = queue; 

//helper.js

const Sync = require('sync'); 
const order = require('./order'); 
const dao = require('./dao'); 
const config = require('./config'); 

Sync(function() { 
    console.log("in sync"); 

    while (true) { 
     // I got queue size always 0(zero), even though I called pay api(meaning put order into the queue by calling api) 
     if (order.queue.size() > 0) { 
      console.log("here"); 

      var id = order.queue.deq(); 
      var query = "query string"; 
      dao.client.execute(query, [config.orderStatus.preparing, id], {prepare: true}, function (err, result) { 
       Sync.sleep(5000); 
       dao.client.execute(query, [config.orderStatus.served, id], {prepare: true}, function (err, result) { 
        Sync.sleep(5000); 
        dao.client.execute(query, [config.orderStatus.collected, id], {prepare: true}, function (err, result) { 
         Sync.sleep(5000); 
        }); 
       }); 
      }); 
     } 
    } 
}); 

我在order.js出口隊列但它與幫手線程沒有共享參考。

我已經應用了很多方法來實現上述功能,但無法成功實現。 任何人都可以請建議我的解決方案?

回答

0

您不能與thread模塊共享參考。您只能發送消息。您可以在沒有隊列的情況下構建它,也可以使用超出處理隊列的隊列。一種選擇是在kue模塊中使用兩個進程。

例子:

var kue = require('kue') 
, queue = kue.createQueue(); 

queue.process('email', function(job, done){ 
    email(job.data.to, done); 
}); 

function email(address, done) { 
    if(!isValidEmail(address)) { 
    //done('invalid to address') is possible but discouraged 
    return done(new Error('invalid to address')); 
    } 
    // email send stuff... 
    done(); 
} 
+0

謝謝您的答覆。道歉,我仍然不明白如何根據我的要求使用kue模塊。你能詳細解釋一下嗎? –

+0

我可以,但你甚至沒有盡我所能去應用我所說的,所以如果你學會了如何做自己的編程會更好。 –