цепочка асинхронных функций в node.js - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть асинхронная функция, которая принимает my_url в качестве параметра и обновляет его значение при каждом запуске:

function getUser(my_url) {
 var options = {url: my_url};
 request(options, function (body){
    my_url = body.url;
 });
}

Я хочу вызывать эту функцию неопределенное время.Например: getUser ("a") возвращает "b", getUser ("b") возвращает "c" и так далее.Какова лучшая практика здесь?Я пытался заставить getUser () возвращать promise с my_url в качестве значения, но я не знаю, как это вызывать повторно.

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Я не уверен, что это то, что вы ищете, но вот пример использования рекурсии и request-promise:

const rp = require('request-promise')

const url = "https://google.com"
var options = {
    uri: url
}

var count = 0

function chain(options, count) {
    const newURL = `${url}/?count=${count}`
    console.log(`Requesting ${newURL}`)
    rp(options).then(function(body) {
        console.log(`Success, body was ${body.length} bytes`)
        count = count + 1;
        if ( count < 20 ) {
            options = {
                uri: newURL
            }
            // recursion

            chain(options, count)
        }
    }).catch(function (err) {
        console.log(`An error occurred: ${err}`)
    })
}

chain(options, count)

Когда я запускаю это, вот вывод:

Requesting https://google.com/?count=0
Success, body was 45855 bytes
Requesting https://google.com/?count=1
Success, body was 45861 bytes
Requesting https://google.com/?count=2
Success, body was 45864 bytes
Requesting https://google.com/?count=3
Success, body was 45875 bytes
Requesting https://google.com/?count=4
Success, body was 45859 bytes
Requesting https://google.com/?count=5
Success, body was 45851 bytes
Requesting https://google.com/?count=6
Success, body was 45882 bytes
Requesting https://google.com/?count=7
Success, body was 45843 bytes
Requesting https://google.com/?count=8
Success, body was 45892 bytes
Requesting https://google.com/?count=9
Requesting https://google.com/?count=9
Success, body was 45835 bytes
Requesting https://google.com/?count=10
Success, body was 45885 bytes
Requesting https://google.com/?count=11
Success, body was 45865 bytes
Requesting https://google.com/?count=12
Success, body was 45851 bytes
Requesting https://google.com/?count=13
Success, body was 45859 bytes
Requesting https://google.com/?count=14
Success, body was 45905 bytes
Requesting https://google.com/?count=15
Success, body was 45848 bytes
Requesting https://google.com/?count=16
Success, body was 45896 bytes
Requesting https://google.com/?count=17
Success, body was 45879 bytes
Requesting https://google.com/?count=18
Success, body was 45877 bytes
Requesting https://google.com/?count=19
Success, body was 45844 bytes

Вы могли бы легко разобрать следующий URL в ответе then(), если бы у вас был сервер, который вел себя таким образом.Я добавил счет, чтобы предотвратить бесконечную рекурсию.

0 голосов
/ 03 марта 2019

Вы можете попробовать что-то вроде этого (я немного изменил создание URL, чтобы продемонстрировать поток с примером URL):

'use strict';

const request = require('request');

function delay(ms) {
  return new Promise((resolve) => { setTimeout(resolve, ms); });
}

function promisifiedRequest(url) {
  return new Promise((resolve, reject) => {
    request({ url }, (err, res, body) => {
      if (err) reject(err);
      else resolve(body);
    });
  });
}

(async function main() {
  try {
    let url = 'https://example.com';

    while (url !== null) {
      const body = await promisifiedRequest(url);
      url = `https://example.com?q=${
        encodeURIComponent(body.slice(0, Math.floor(Math.random() * 50)))
      }`;
      console.log(url);
      await delay(1000);
    }
  } catch (err) {
    console.error(err);
  }
})();
0 голосов
/ 01 марта 2019
function getUser(my_url) {
      var options = {url: my_url};

      if(my_url == "some stop condition") return ;

      request(options, function (body){
         my_url = body.url;
      }).then( response => {
           getUser(response);
      });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...