我该如何调用带有promise的函数?

时间:2018-06-29 08:45:02

标签: 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);
     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);


    })
}

2 个答案:

答案 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,您将得到答案