Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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
Javascript 如何调用有承诺的函数?_Javascript_Promise - Fatal编程技术网

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
块中?@MartinAJ
var 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
块中?@MartinAJ
var getLinks=gblink.getBlogLinks(“www.example.com”);console.log(getLinks);解析(getLinks)。请参见第一个代码段中的。我认为这个解决办法可能行不通<代码>解析(数据)
在您的代码中不会解析正确的
数据
,而是将
getBlogLinks
接收的
数据
作为参数。哦,这可能是一个误解,让我纠正一下。我认为这个解决办法可能行不通<代码>解析(数据)
在您的代码中不会解析正确的
数据
,而是将
getBlogLinks
接收到的
数据
作为参数。哦,这可能是一个误解,让我更正一下