Как избавиться от асинхронности в функции? - PullRequest
0 голосов
/ 03 декабря 2018

Допустим, у меня есть этот код:

const myFunction = async => {
  const result = await foobar()
}

const foobar = async () => {
  const result = {}
  result.foo = await foo()
  result.bar = await bar()
  return result
}

И я хочу это:

const myFunction = () => {
  const result = foobar()
}

Я пытался обернуть foobar так:

const foobar = async () => {
  return (async () => {
    const result = {}
    result.foo = await foo()
    result.bar = await bar()
    return result
  })()
}

Но это все равно возвращает обещание

Я не могу использовать .then в myFunction , мне нужен этот foobar вместо результата возвращается переменная результата.

Проблема в том, что myFunction является асинхронной функцией и возвращает обещание, но должно возвращать неопределенное значение. Мне нужно избавиться от асинхронности в myFunction .

Редактировать: как сказал Себастьян Спейтель, я хочу преобразовать myFunction в синхронизацию

Редактировать 2: в Shilly, я использую ночные часы для end2endtest, nightwatch вызовет myFunction () , если при выполнении функции не будет ошибок, она будет работать идеально, если возникнет ошибка, то виртуальные машины nightwatch будут работать вечно, вместо остановки, эта проблема возникает, если вызываемыйфункция асинхронная.

Ответы [ 5 ]

0 голосов
/ 03 декабря 2018

Проверьте это

    function foo(){
      return 'foo'
    }
    function bar(){
      return 'bar'
    }
    const foobar = () => {
        return new Promise((resolve)=>{
          let result = {}
          result.foo = foo()
          result.bar = bar()
          return resolve(result)
        })
    }

    const myFunction = () => {
      const result = foobar()
      let response = {}
      result.then(val=>{
        response = Object.assign({}, val);
        return response
      });
    }

    var test = myFunction()
    console.log(test)
0 голосов
/ 03 декабря 2018

Чтобы преобразовать асинхронную функцию в обычную синхронную функцию, вам просто нужно удалить ключевое слово async и в результате все ключевые слова await внутри этой функции.

const myFunction = async () => {
    const result = await foobar();
    // ...
    return 'value';
};

// becomes

const myFunction = () => {
    const result = foobar();
    // ...
    return 'value';
};

Однако вы должны сохранить однопомните простое правило.

  1. Нельзя преобразовать асинхронную функцию в синхронную функцию, если возвращаемое значение зависит от значения (й) разрешенного (ых) обещания (й).

Это означает, что функции, которые обрабатывают обещания внутри своего тела, но от которых возвращаемое значение не зависит от этих разрешенных обещаний, прекрасно подходят как синхронные функции.В большинстве других сценариев вы не можете отбросить асинхронное поведение.

Следующий код дает вам пример для вашей ситуации, предполагая, что возвращаемое значение myFunction не зависит от разрешенного обещания.

const myFunction = () => {
    const result = foobar();

    result.then(data => doSomethingElse(data))
          .catch(error => console.error(error));

    return 'some value not dependent on the promise result';
};

Если вы хотите больше узнать об обещаниях, я предлагаю ознакомиться с справочником обещаний и страницей async / await.

0 голосов
/ 03 декабря 2018

Вам не хватает очень важного понимания между синхронной и асинхронной природой кода.

Не каждая асинхронная функция может быть преобразована в синхронную функцию.Вы можете использовать шаблон обратного вызова вместо await / async, но я сомневаюсь, что это было бы полезно для вас.

Вместо этого я бы порекомендовал вам просто использовать await, как в первом примере кода, и оставить функции асинхронными, это не должно повредить вашей логике.

0 голосов
/ 03 декабря 2018

Вы пытались использовать .executeAsync (), а затем получить обещание для обратного вызова .done ()?Таким образом, должна быть возможность обернуть foobar и просто сохранить в этой оболочке либо асинхронные, либо любые вызовы .then ().

Мои знания о ночных часах очень устарели, но, возможно, что-то вроде:

() => {
  client.executeAsync(( data, done ) => {
    const result = await foobar();
    done( result );
  });
};

или:

  () => {
    client.executeAsync(( data, done ) => foobar().then( result => done( result )));
  };
0 голосов
/ 03 декабря 2018

Любая функция, отмеченная async, вернет Обещание.Это:

const foobar = async () => {
  return 7;
}

Возвращает ли Обещание 7. Это полностью не зависит от того, вызывает ли функция, которая вызывает foobar, значение async или нет, или использует await или нет при вызове.

Итак, ваша проблема не только в myFunction: foobar использует async, что вынуждает его всегда возвращать Обещание.

Теперь сказал, что вы, вероятно, не можете достичь того, чего хотите .Async-Await является только синтаксическим сахаром для обещаний .Вы пытаетесь вернуть синхронное значение из асинхронной операции , и это в принципе запрещено в javascript.

...