Saat ini saya sedang berjuang dengan masalah tentang pm.sendRequest dalam skrip Pra-permintaan Postman. Saya mencoba menjalankan Permintaan dalam loop for, tetapi sesuatu itu tidak berfungsi dengan baik.

Skrip Pra-permintaan

var numberOfCampaigns = 2; //this number can have any value from 1 to 20)
for (var j = 0; j < numberOfCampaigns; j++) {
    console.log(`J1:` + j);
  var request_call = {
    url: pm.environment.get("api-url"),
    method: "POST",
    header: {
      "content-type": "text/xml",
      SOAPAction: "add",
    },
    body: {
      mode: "raw",
      raw: "some-body"},
  };
  pm.sendRequest(request_call, (err, res) => {
    if (err) {
    } else {
      console.log(`J2:` + j);
        length = 2
        for (var i = 0; i < length; i++) {
        pm.environment.set(`someVariable_` + i + `_` + j, responseJson[i]);       
        console.log(`someVariable:`+i+`_`+j+`:`+ pm.environment.get(`someVariable_` + i + `_`+j));
      }
    }
  });
  console.log(`J3:` + j);
}

Keluaran konsol:

J1:0
J3:0
J1:1
J3:1
POST https://api-url/
J2:2
someVariable_0_2:...
someVariable_1_2:...
POST https://api-url/
J2:2
someVariable_0_2:...
someVariable_1_2:...
GET https://api-url2/ (The actual Request)

Saya tidak mengerti mengapa output konsol J2 adalah 2 bukannya 1 untuk Permintaan pertama lalu 2 untuk Permintaan kedua

Bisakah Anda membantu?

PERBARUI

Setelah tanggapan @Keith saya mencoba membuat beberapa perubahan:

var numberOfCampaigns = 2

const _dummy = setInterval(() => {}, 300000 );

function sendRequest(req) {
    
    return new Promise((resolve, reject) => {
        pm.sendRequest(req, (err,res) => {
            if (err) {
                console.log(err);
                return reject(err);
        }
      console.log(`J2:` + j);
      for (let i = 0; i < length; i++) {  
        pm.environment.set(`someVariable_` + i + `_` + j, responseJson[i]);       
        console.log(`someVariable:`+i+`_`+j+`:` + pm.environment.get(`someVariable_` + i + `_`+j));
      }
        return resolve(res);
    })
    });
}

(async function main() {
    for(var j=0; j<numberOfCampaigns; j++){
        var request_call = {
        url: pm.environment.get("api-url"),
        method: "POST",
        header: {
          "content-type": "text/xml",
          SOAPAction: "add",
        },
        body: {
          mode: "raw",
          raw: pm.environment.get(`parameter`+j},
        };
        await sendRequest(request_call);
        clearInterval(_dummy);
    }
})();
0
Paracetamol12 13 Mei 2021, 18:18

1 menjawab

Jawaban Terbaik

Skrip Anda asinkron - pm.sendRequest membuat permintaan dan memanggil fungsi panggilan balik saat permintaan itu selesai.

Itu mungkin memakan waktu yang bervariasi.

Saya berharap skrip Anda dimulai:

J1:0
J3:0
J1:1
J3:1

Karena semua itu sinkron.

J2: akan muncul ketika permintaan HTTP Anda kembali, tetapi pada saat itu loop Anda akan selesai, sehingga keduanya akan menampilkan J2:2.

Perhatikan bahwa i akan berfungsi karena ada di dalam fungsi panggilan balik Anda, dan var j adalah global - JS tidak menerapkan penutupan ke loop atau blok kecuali Anda menggunakan let j dan panggilan balik akan tetap menyimpan referensinya.

Anda bahkan mungkin mendapatkan someVariable log rusak karena permintaan tidak akan mengantri - server apa pun yang dapat menyelesaikan permintaan kedua sebelum yang pertama.

Cara terbaik untuk menghindari ini adalah dengan await atau Promise.all untuk memastikan bahwa JS Anda di luar panggilan balik tidak berjalan sampai tindakan asinkron selesai.

1
Keith 13 Mei 2021, 15:25