Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 然后噩梦()在evaluate()之后立即调用_Node.js_Web Scraping_Electron_Es6 Promise_Nightmare - Fatal编程技术网

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()
中的回调函数有一个额外的参数来解析噩梦承诺。