Chcę wywołać funkcję asynchroniczną wewnątrz pętli for  function test(req,res){ //tutaj część logiczna funkcja asynchroniczna utwórz(dane){ //tutaj część logiczna } for( var wartość w wartościach){ // trochę ...

2
Vikas 29 czerwiec 2021, 07:56

6 odpowiedzi

Najlepsza odpowiedź

Po prostu umieść async przed testem funkcji.

async function test(req, res) {…

Jeśli chcesz await obietnicę, to funkcja używająca await musi być funkcją async.

2
Ethan Doh 29 czerwiec 2021, 05:06

Zawijanie i tworzenie nowej funkcji wewnątrz innej funkcji nie jest dobrym ideałem. Możesz przenieść funkcję tworzenia na zewnątrz, jak poniższy kod code

 async function create(data){
 //logic part here
 }
 
async function test(req,res){
 //somelogic part here

 for( var value in values){
  // some codeing part here
  await create(data);
  }
}

Lub zamiast tego użyj funkcji strzałki

async function test(req,res){
 //somelogic part here
 const create = async (data) => {
 //logic part here
 }
 for( var value in values){
  // some codeing part here
  await create(data);
  }
}
1
Khanh Chau 29 czerwiec 2021, 05:29

Twoje pytanie jest trochę mylące, ponieważ nie ma żadnego powodu, aby async/awaitcreate nie zwraca żadnych danych, więc aync/await wydaje się zbędne i prawdopodobnie możesz usunąć to.

Jeśli jednak create zwraca wartość i chcesz poczekać, aż wszystkie wartości zostaną zwrócone, zanim przejdziesz dalej, utwórz tablicę wywołań funkcji, a następnie użyj Promise.all czekać, aż obietnice zwrócą się z create rozwiązały.

// `create` returns a promise that resolves
// after two seconds
function create(data){
  return new Promise((res, rej) => {
    setTimeout(() => res(data), 2000);
  });
}


async function test(req,res) {
 const values = [1, 2, 3, 4];

 // Create an array of promises
 const arr = values.map(el => create(el));

 // And use Promise.all to wait to resolve them
 const output = await Promise.all(arr);
 console.log(output);
}

test();
0
Andy 29 czerwiec 2021, 06:21

Problem nie dotyczy Twojej funkcji create, ale funkcji test. Zakres, w którym wywołujesz składnię await, musi wynosić async. Dlatego Twój zakres to test.

Po prostu zaktualizuj swój kod do następującego;

/*vv --> async*/
async function test(req, res) {
  console.log("test is called");

  async function create(to) {
    return new Promise((resolve) => {
      setTimeout(() => resolve(Date.now()), to);
    });
  }

  const values = {
    a: 1e3,
    b: 2e3,
    c: 3e3
  };

  for (var value in values) {
    // some codeing part here
    const to = values[value];
    const result = await create(to);
    console.log("result:", result);
  }

  return 1;
}

(async() => {
  const res = await test();
  console.log("done");
})();
1
choz 29 czerwiec 2021, 05:36

Cześć Jak zrozumiałem Twoje obawy, sugerowałbym użycie funkcji .map() , która jest bardzo przydatna w tego typu przypadkach.

async function create(data) {
   // Create user logic here
}
const usernames = ['test1', 'test2', 'test3'];
const createdUsers = usernames.map(async (val) => {
    const user = await create();
    return user;
});

await Promise.all(createdUsers);
1
Ashish Sharma 29 czerwiec 2021, 05:16

Jeśli wywołanie funkcji asynchronicznej będzie dotyczyło tylko części pętli for, oznacza to, że możesz po prostu wypchnąć obietnicę zwróconą przez wywołania asynchroniczne do tablicy i użyć metod statycznych obietnic, takich jak „all”

let pros= []
for(){
    pro.push(create(data));
}
Promise.all(pros).then(()=> {
    #implement rest or resolve another promise
})

Proszę odnieś się.. https://developer.mozilla.org/ pl/docs/Web/JavaScript/Reference/Global_Objects/Promise/wszystko

1
Karthikeyan 29 czerwiec 2021, 05:24