Как я могу вызвать функцию с обещанием? - PullRequest
0 голосов
/ 29 июня 2018

Вот мой код:

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 голосов
/ 29 июня 2018

Я предполагаю, что getBlogLinks() - это функция, реализованная в вашей области разработки.

Итак, что происходит, в вашем текущем коде getBlogLInks() ответ возвращается только при наличии ответа. Но, как вы это называете, это синхронно.

Ваш getBlogLinks должен быть завернут в обещание.

getBlogLinks(data) {
  return new Promise( function(resolve,reject) {
      ....all your function code
      .then(data) {
          resolve(data); 
       }
  });
  }

затем используйте getBlogLinks().then, и вы получите ответ

0 голосов
/ 29 июня 2018

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;
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...