Node.js 然后噩梦()在evaluate()之后立即调用
考虑以下代码段:Node.js 然后噩梦()在evaluate()之后立即调用,node.js,web-scraping,electron,es6-promise,nightmare,Node.js,Web Scraping,Electron,Es6 Promise,Nightmare,考虑以下代码段: nightmare .evaluate(function (resolve){ setTimeout(function () { resolve(null, 1234); }, 1500) }) .then(function (result) { console.log('SUCCESS', result); }) .catch(function (e) {
nightmare
.evaluate(function (resolve){
setTimeout(function () {
resolve(null, 1234);
}, 1500)
})
.then(function (result) {
console.log('SUCCESS', result);
})
.catch(function (e) {
console.log('ERROR', e);
});
假设噩梦
实例之前已经初始化过,我还使用了goto()
和inject()
等方法(这部分代码非常庞大,但如果需要的话,我可以尝试清理它以呈现在那里)。但我最终得到的结果不太可能是SUCCESS null
,而不是SUCCESS 1234
我曾经尝试过这一点,并且了解到,如果在该链中的.evaluate()
之前调用.wait(15000)
(或者在.goto()
之后和.evaluate()
之前设置一个断点,并在触发时等待一段时间),代码将按照预期的方式工作
该代码有什么问题?考虑以下答案
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,必须解析1234,而不是null
了解更多关于承诺的信息
resolve(null,1234)
为什么传递null而期望传递1234?因为,如果根据规范,第一个参数是错误的结果(而不是使用reject()
)传递给catch()
。但是我需要调用then()
函数,因此,我将null
作为第一个参数传递。虽然这其实并不重要。真正重要的是,then()
在setTimeout()完成之前雇佣并调用resolve()
。您不会返回任何内容。在中有一个使用承诺的示例。基于噩梦的文档-您正在使用。evaluate
wrong@JaromandaX真正地从文档中复制粘贴:如果传递的参数比被求值函数预期的参数少一个,则求值将作为最后一个参数传递给函数。
。我不应该返回某些内容,因为我正在使用setTimeout()
函数来解析延迟的承诺(在1500毫秒内)。如果我将返回某个内容,它应该不会产生任何影响,因为evaluate()
中的回调函数有一个额外的参数来解析噩梦承诺。