2017-03-16 60 views
0

我試圖用CasperJS運行一個自動作業,它帶來了一個JSON文件,並檢查在每個JSON對象中聲明的給定頁面上是否存在某些元素。我試圖遞歸地寫這個,但我遇到了一個問題,即異步遞歸流(即我唯一的同步函數)的開始是同步返回(如預期的)並導致腳本失敗。CasperJS中的異步遞歸處理和事件委託

根據this CasperJS github issue,PhantomJS當前不支持Promise。我也嘗試了.waitFor()CasperJS method,但是如果我嘗試從最終的異步方法冒出一個返回值true,則會導致無限循環(還存在waitFor由超時值控制而不等待響應的問題,但超時值可以更改)。這裏是一個代碼示例嘗試使用下面waitFor,稍作簡化:

casper.start(urlStart, function() { 
    recursiveRun(jsonInput.length); 
}); 

var recursiveRun = function(count) { 
    if (count) { 
     casper.waitFor(function check() { 
      return controller(); // Infinite loop here 
     }, function then() { 
      jsonInput.shift(); 
      recursiveRun(count - 1); 
     } 
    } 
} 

var controller = function() { 
    casper.thenOpen(jsonInput[0].url, function() { 
     return renavigation(); 
    } 
} 

var renavigation = function() { 
    casper.waitForSelector("#nav", function() { 
     this.thenOpen(inventoryUrl, function() { 
      return inventoryEvaluation(); 
     } 
    } 
} 

var inventoryEvaluation = function() { 
    casper.waitForSelector("#status", function() { 
     this.evaluate(function() { 
      // Unimportant in-browser function 
     } 

     return true; 
    } 
} 

casper.run(); 

這是爲什麼不工作?如果有的話,遞歸和異步執行這些操作的正確方法是什麼?

回答

0

CasperJS method.eachThen()似乎按預期執行此功能。

從上面的例子可以看出,遞歸調用自己的同步函數可以完全替代爲讓CasperJS遍歷.start()方法的回調中的jsonInput變量。

casper.start(urlStart, function() { 
    this.eachThen(jsonInput, function() { 
     controller(); 
     jsonInput.shift(); 
    } 
}