Javascript 如何调用有承诺的函数?
这是我的密码:Javascript 如何调用有承诺的函数?,javascript,promise,Javascript,Promise,这是我的密码: 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);
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(“此处”)代码>将被打印,然后console.log(数据)代码>将被打印为未定义
无论如何,在getBlogLinks()
的结果返回之前,我如何才能做出承诺
请注意,当我手动调用gblink.getBlogLinks()
函数时,它也可以工作,只需花一段时间,现在我需要做的就是为该函数实现一个等待系统
下面是gblink.getBlogLinks()
:
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;
})
编辑2:
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;
})
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;
})
编辑2:
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;
})
我假设getBlogLinks()
是在您的开发范围内实现的一个函数
那么,在您当前的getBlogLInks()
代码中发生了什么,只有在有响应时才会返回响应。但按你的说法,它是同步的
您的getBlogLinks
需要包装在承诺中
getBlogLinks(data) {
return new Promise( function(resolve,reject) {
....all your function code
.then(data) {
resolve(data);
}
});
}
然后使用getBlogLinks()。然后
您将得到您的答案我假设getBlogLinks()
是在您的开发范围内实现的函数
那么,在您当前的getBlogLInks()
代码中发生了什么,只有在有响应时才会返回响应。但按你的说法,它是同步的
您的getBlogLinks
需要包装在承诺中
getBlogLinks(data) {
return new Promise( function(resolve,reject) {
....all your function code
.then(data) {
resolve(data);
}
});
}
然后使用getBlogLinks()。然后
您将得到您的答案您需要在gblink中调用resolve。getBlogLinks callback是gblink。getBlogLinks()本身就是一个承诺吗?然后你必须在上面实现then()。@codeteq不,这不是承诺。这是一场噩梦。你能分享getbloglinks()的实现吗?@aseempadhyay当然。你需要在gblink中调用resolve。getbloglinks回调是gblink。getbloglinks()本身就是一个承诺吗?然后你必须在上面实现then()。@codeteq不,这不是承诺。这是一场噩梦。你能分享getbloglinks()的实现吗?@aseempadhyay-Sure..@MartinAJ-Welcome:)请注意,你的解决方案并不完全有效。如果我在函数的getBlogLinks
块中写入console.log(data)
,那么它将起作用。但是,getBlogLinks
函数仍然不会将结果返回到主页面中的承诺。@MartinAJ您可以console.log(getLinks)
并检查它是否是承诺吗?我应该在哪里写入console.log(getLinks)
?在promise上的resolve
块中?@MartinAJvar getLinks=gblink.getBlogLinks(“www.example.com”);console.log(getLinks);解析(getLinks)代码>。见第一段代码snippet@MartinAJ欢迎:)请注意,您的解决方案并不完全有效。如果我在函数的getBlogLinks
块中写入console.log(data)
,那么它将起作用。但是,getBlogLinks
函数仍然不会将结果返回到主页面中的承诺。@MartinAJ您可以console.log(getLinks)
并检查它是否是承诺吗?我应该在哪里写入console.log(getLinks)
?在promise上的resolve
块中?@MartinAJvar getLinks=gblink.getBlogLinks(“www.example.com”);console.log(getLinks);解析(getLinks)代码>。请参见第一个代码段中的。我认为这个解决办法可能行不通<代码>解析(数据)
在您的代码中不会解析正确的数据
,而是将getBlogLinks
接收的数据
作为参数。哦,这可能是一个误解,让我纠正一下。我认为这个解决办法可能行不通<代码>解析(数据)
在您的代码中不会解析正确的数据
,而是将getBlogLinks
接收到的数据
作为参数。哦,这可能是一个误解,让我更正一下