2017-11-18 223 views
1

考慮下面的代碼片斷:夢魘)調用立即評估後()

nightmare 
    .evaluate(function (resolve){ 
     setTimeout(function() { 
      resolve(null, 1234); 
     }, 1500) 
    }) 
    .then(function (result) { 
     console.log('SUCCESS', result); 
    }) 
    .catch(function (e) { 
     console.log('ERROR', e); 
    }); 

假設nightmare實例已被初始化之前,我也使用的方法如goto()inject()(的代碼部分是非常巨大的,但我可以嘗試清潔它,如果有必要在那裏呈現)。但我最終得到的結果 - 不太可能是SUCCESS null而不是SUCCESS 1234

我與實驗,並已明白,如果調用.wait(15000)在鏈.evaluate()之前(或設置一個斷點.goto()後和.evaluate()前等待時,它的發射一些時間),代碼工作,因爲它的準確預期。

該代碼有什麼問題?

+0

'決心(空,1234)'爲什麼你傳遞*空*但預計* 1234 *? – str

+0

因爲,如果根據規範,第一個參數是錯誤的結果(而不是使用'reject()')傳遞給'catch()'。但是我需要調用'then()'函數,因此,我將'null'作爲第一個參數。儘管這並不重要。真正重要的是'then()'在* setTimeout()結束並調用'resolve()'之前僱用*。 – impulsgraw

+0

你不會返回任何東西。在[.evaluate']文檔中有一個使用Promise的例子(https://github.com/segmentio/nightmare#evaluatefn-arg1-arg2)。 – str

回答

0

考慮下面的答案,

nightmare 
    .evaluate(function(){ 
     return new Promise((resolve, reject)=>{   
     setTimeout(function() { 
      resolve(1234); 
     }, 1500) 
     }) 
    }) 
    .then(function (result) { 
     console.log('SUCCESS', result); 
    }) 
    .catch(function (e) { 
     console.log('ERROR', e); 
    }); 

它有什麼作用?它返回一個承諾。所以代碼會一直等到它解決。

此外,如果您想獲得1234而不是null,則必須解析1234。

瞭解更多有關承諾,