这是我的代码:
var gblink = require('./getbloglinks');
new Promise(function (resolve, reject) {
var getLinks = gblink.getBlogLinks("www.example.com");
resolve(getLinks);
}).then(function (data) {
console.log("here");
console.log(data);
return false;
})
gblink.getBlogLinks()
是一个获取URL并返回该页面(短时间后)中的所有链接的函数。运行代码时,将立即打印console.log("here");
,然后将console.log(data);
打印为undefined
。
无论如何,我如何才能等到getBlogLinks()
的结果返回之前的诺言?
请注意,当我手动调用gblink.getBlogLinks()
函数时,它也能正常工作,只需要一段时间,而现在我要做的就是为该函数实现一个等待系统。
这里是gblink.getBlogLinks()
:
const NN = require('nightmare');
exports.getBlogLinks = function (data){
const n = NN({show:true});
n.goto(data)
.evaluate(() => {
var data = document.querySelectorAll("a[target='_blank']");
arr = [];
i=0;
Array.from(data).forEach( function(x){
arr[i] = x.href;
i++;
});
return arr;
})
.then((data) => {
return n.end(data);
})
}
答案 0 :(得分:2)
getBlogLinks
没有兑现承诺。这样做应该可以解决问题。
const NN = require('nightmare');
exports.getBlogLinks = function (data){
const n = NN({show:true});
return n.goto(data)
.evaluate(() => {
var data = document.querySelectorAll("a[target='_blank']");
arr = [];
i=0;
Array.from(data).forEach( function(x){
arr[i] = x.href;
i++;
});
return arr;
})
.then((data) => {
n.end(data);
return data;
})
};
编辑:
var gblink = require('./getbloglinks');
new Promise(function (resolve, reject) {
var getLinks = gblink.getBlogLinks("www.example.com");
console.log(getLinks);//========= Here You will get Pending promise =========
resolve(getLinks);
}).then(function (data) {
console.log("here");
console.log(data);//========= Here You will get the array=========
return false;
})
Edited2:
var gblink = require('./getbloglinks');
/*
new Promise(function (resolve, reject) {
var getLinks = gblink.getBlogLinks("www.example.com");
console.log(getLinks);//========= Here You will get Pending promise =========
resolve(getLinks);
})*/
//Below is recommended way to chain the promise, avoid promise constructor, if not needed
gblink.getBlogLinks("www.example.com")
.then(function (data) {
console.log("here");
console.log(data);//========= Here You will get the array=========
return false;
})
答案 1 :(得分:0)
我假设getBlogLinks()
是在您的开发范围内实现的功能。
所以,发生了什么事,在您当前的getBlogLInks()
代码中,只有在有响应时才返回响应。但是,您称呼它的方式是同步的。
您的getBlogLinks
需要包含在承诺中。
getBlogLinks(data) {
return new Promise( function(resolve,reject) {
....all your function code
.then(data) {
resolve(data);
}
});
}
然后使用getBlogLinks().then
,您将得到答案