Как я могу избежать использования другого обещания в моем случае? - PullRequest
1 голос
/ 07 января 2020

У меня есть два. js файла, таких как:

index. js:

app.get("/testing", (req, res) => {
  testAsyncFunction().then((resolvedData) => {
    res.send(resolvedData);
  });
})

и сервер. js:

const asyncFunction = () => {
  return new Promise((res) => {
    setTimeout(() => {
      res('resolved');
    },3000 )
  })
}

const testAsyncFunction = () => {
  return new Promise(async (res) => {
    const result = await asyncFunction();
    return res(result);
  })
}

и это работает как задумано, но если я изменю функцию testAsyncFunction (чтобы я не создавал новое обещание) на что-то вроде этого:

const testAsyncFunction = async () => {
  const result = await asyncFunction();  
  return result;
}

и в index. js:

app.get("/testing", (req, res) => {
  res.send(testAsyncFunction());
})

Я получаю пустой объект, потому что он не ждет 3 секунды, что я упускаю в последнем случае? Я хочу избежать создания нового Обещания, просто ожидая другого обещания.

ОБНОВЛЕНИЕ

Я изменил функцию testAsync на что-то вроде этого:

const testAsyncFunction = () => {
  asyncFunction().then((result) => {
    return result;
  })  
}

Хотя выше функция. это не asyn c функция, почему я все еще должен ждать ее в index.js .. Я предполагаю, что возвращаемое значение не будет обещанием в этом случае, так что это часть, в которой я запутался .

Ответы [ 2 ]

1 голос
/ 07 января 2020
const testAsyncFunction = async () => {
  const result = await asyncFunction();  
  return result;
}

async функции всегда возвращают обещания. Так что это эквивалентно:

const testAsyncFunction = () => {
  return asyncFunction();  
}

Я хочу не создавать новое обещание, просто ждать другого обещания.

Так что просто используйте существующее Обещание:

app.get("/testing", (req, res) => {
  asyncFunction().then((resolvedData) => {
    res.send(resolvedData);
  });
})

const asyncFunction = () => {
  return new Promise((res) => {
    setTimeout(() => {
      res('resolved');
    },3000 )
  })
}
1 голос
/ 07 января 2020

so that I don't create a new promise так и должно быть, другой путь - антипаттерн. Однако когда функция возвращает обещание, вам нужно дождаться того же

app.get("/testing", async (req, res) => {
  let obj = await testAsyncFunction()
  res.send(obj );
});

ИЛИ

app.get("/testing", (req, res) => {
  testAsyncFunction().then((obj) => {
    res.send(obj );
  })
});
...