2017-11-18 179 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。

了解更多有关承诺,