Как избежать вложенных обещаний? - PullRequest
1 голос
/ 12 марта 2020

Как я могу изменить следующий код, чтобы избежать вложения обещаний?

Ответ на запрос-обещание необходимо вставить в Firestore.

Я также хотел бы знать, как получить jsonresponse, доступный, когда Обещание Firestore разрешено для отправки response.status приложению вызывающей стороны.

const functions = require('firebase-functions');
const rp = require('request-promise')
var admin = require("firebase-admin");

var serviceAccount = require("./service_key.json");

admin.initializeApp({
   credential: admin.credential.cert(serviceAccount),
   databaseURL: "https://melitest-5bc38.firebaseio.com"
});

let db = admin.firestore()

exports.customHttpRequest = functions.https.onRequest((request, response) => { 

const url = 'https://jsonplaceholder.typicode.com/users'

var options = {
    uri: url,
    method: "GET",
    json: true
};

rp(options).then((jsonresponse) => {
     for(var i = 0 ; i < jsonresponse.length; i++){
        var obj = jsonresponse[i]
        var docid = obj.id

        // Warning: Avoid nesting promises.eslint(promise/no-nesting)
        db.collection("scrapeusertest").doc(String(docid)).set(obj).then(() =>{ 
            console.log(`Data was upload to firestore and the response was: ${jsonresponse}`)
            response.status(200).send(jsonresponse);
        }).catch(error =>{
            console.log(`Error uploading data Firebase: ${error}`)
        });

    }
    return console.log("Data was send")
})
.catch((err) => {
    console.log('Error:', err)

});
    return null;
});

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

используйте обещание и использовали обещание все как эту форму

    const res= await rp(options);
//should be soure the res is array
     await Promise.all(res.map( async item =>{
    const id=item.id;
     try {
          await db.collection("scrapeusertest").doc(String(id)).set(item);
        } catch (error) {
    //what action when handle wrror
        }))})

вы можете использовать res как то, что вам нужно

0 голосов
/ 13 марта 2020

Самый простой вариант - использовать функцию asyn c:

const db = admin.firestore()

exports.customHttpRequest = functions.https.onRequest(async (request, response) => { 

  const url = 'https://jsonplaceholder.typicode.com/users'
  const options = {
    uri: url,
    method: "GET",
    json: true
  };

  const jsonresponse = await rp(options);

  await Promise.all(jsonresponse.map(async obj => {
    const docid = obj.id
    try {
      await db.collection("scrapeusertest").doc(String(docid)).set(obj);
    } catch (error) {
      console.log(`Error uploading data Firebase: ${error}`);
    }
  }));

  console.log(`Data was upload to firestore and the response was: ${jsonresponse}`);
  response.status(200).send(jsonresponse);
});
...