2013-07-02 290 views
1

我正在測試Jake作爲Rake主要的JavaScript項目的替代品。現在我發現奇怪的一件事是完成事件在事件完成之前被觸發。在完成異步任務之前完成Jake任務

下面是一個例子:

task('some_task_1', {async: true}, function() { 
    console.log("|- Doing something"); 

    var execCallback = function() { 
     console.log(" |- Done something"); 
     complete(); 
    }; 

    setTimeout(execCallback, 2000); 
}); 

task('some_task_2', {async: true}, function() { 
    console.log("|- Doing something else"); 

    var execCallback = function() { 
     console.log(" |- Done something else"); 
     complete(); 
    }; 

    setTimeout(execCallback, 2000); 
}); 

task('task_runner', {async: true}, function() { 
    var firstTask = jake.Task['some_task_1']; 
    var secondTask = jake.Task['some_task_2']; 

    firstTask.addListener("complete", function() { secondTask.invoke(); }); 
    secondTask.addListener("complete", function() { complete(); }); 

    firstTask.invoke(); 
}); 

task('default', function() { 
    jake.Task['task_runner'].invoke(); 
}); 

我本來期望的是,輸出將是:

|- Doing something 
    |- Done something 
|- Doing something else 
    |- Done something else 

但是我實際得到的是:

|- Doing something 
|- Doing something else 
    |- Done something 
    |- Done something else 

那麼,有沒有關於異步應該如何在Jake中工作的一些魔力?因爲它似乎在其實際完成執行前以某種方式發射了一個完整的事件。

== ==編輯

只是所以沒有混亂,我使用傑克的版本0.5.16 https://github.com/mde/jake

== EDIT 2 ==

已經發布了另一個例子現在應該以更清晰的方式顯示確切的問題,因爲它似乎與異步任務內的任務有關。

+0

谷歌搜索節點傑克網許多不同,但類似的結果。你可以在github上提供文檔鏈接或存儲庫名稱嗎?你的回調和這樣看起來很合理,假設你正確地使用了庫,特別是addListener,並且像所假設的那樣調用函數。 – ChrisCM

+0

這實際上只是一個簡單的本地jake項目,我在幾個小時前敲了敲。實際項目將打印腳本文件編譯爲javascript,但上面的代碼是一樣的。所以不幸的是沒有github鏈接或任何東西......我確實嘗試了谷歌搜索,但沒有直接相關的帖子和​​我的問題,大多數是關於如何使用第三方庫做序列構建。一切*似乎*罰款給我,只是不會運行,因爲我會有預期:( – Grofit

回答

0

在節點0.8到0.10之間似乎有行爲改變(不確定它是否是bug或功能)。在0.8.14中順序執行的Jake任務(使用async:true)似乎開始在0.10.x中同時運行。

嘗試卸載節點0.10,然後安裝0.8。

+0

我正在運行節點v0.10.12,最小的示例工作正常。 – mde

0

我剛剛用同樣的Jake(v0.5.16)在本地運行。我不得不糾正語法 - 你需要一個逗號後您的OPTS對象,和我做了該命令的true命令,只所以會是什麼運行:

task('some_task_1', {async: true}, function() { 
    console.log("|- Doing something"); 

    var command = "true"; 
    jake.exec(command, {}, function(){ 
     console.log(" |- Completed doing something"); 
     complete(); 
    }); 
}); 

task('some_task_2', {async: true}, function() { 
    console.log("|- Doing something else"); 

    var command = "true"; 
    jake.exec(command, {}, function(){ 
     console.log(" |- Completed doing something else"); 
     complete(); 
    }); 
}); 

task('some_task_root', {async: true}, function() { 
    var firstTask = jake.Task['some_task_1']; 
    var secondTask = jake.Task['some_task_2']; 

    firstTask.addListener("complete", function() { secondTask.invoke(); }); 
    secondTask.addListener("complete", function() { complete(); }); 

    firstTask.invoke(); 
}); 

這就是我變了,但我得到了正確的輸出,你描述的不是什麼:

$ jake some_task_root 
|- Doing something 
    |- Completed doing something 
|- Doing something else 
    |- Completed doing something else 

您好像還開通了GitHub的問題本(https://github.com/mde/jake/issues/202),讓我們解決它在那邊的問題。最小的例子工作正常,所以你的構建腳本必須有特定的東西。讓我們來了解更多細節,並嘗試讓你理清。 :)

+0

我已經在那裏更新了一個更清晰的例子,其中展示了其他計算機上的行爲,我可以與您一起檢查一下,看看您是否有時間。 – Grofit