Async: Вернуть обещание, если обратный вызов не предоставлен?

Созданный на 27 февр. 2018  ·  8Комментарии  ·  Источник: caolan/async

Приятно иметь в ES2017 асинхронную/ожидающую разработку

const asyncjs = require('async');
const foo = async () => {
    const arr = Array.from({ length: 1000 }, (v, i) => i);
    const transformedArr = await asyncjs.mapLimit(arr, 100, async (v) => {
        return await Promise.resolve(v * 2);
    });
    console.log(transformedArr);
}
feature feedback-wanted

Самый полезный комментарий

Я подумал об этом и немного поэкспериментировал. Люди захотят await Async.mapLimit(arr, 10, async foo => {...}) . Это вполне может быть что-то, что мы включим в 3.0.

Кроме того, некоторые асинхронные методы были бы довольно глупыми с async/await, например, series , waterfall .

Все 8 Комментарий

Исторически так сложилось, что async были против этого (см. #1086).

Тем не менее, с новым синтаксисом async/await , узлом, добавляющим API промисов в будущем , и увеличением поддержки промисов, я был бы готов вернуться к этому. Мысли @aearly @megawac?

Я подумал об этом и немного поэкспериментировал. Люди захотят await Async.mapLimit(arr, 10, async foo => {...}) . Это вполне может быть что-то, что мы включим в 3.0.

Кроме того, некоторые асинхронные методы были бы довольно глупыми с async/await, например, series , waterfall .

При использовании Async я естественным образом предполагал возврат обещания. Только в момент сбоя в работе моего кода и моего рутинного rtfm я заметил структуру обратного вызова. Вышеизложенное было бы очень кстати, так как это позволило бы сохранить код как можно более однородным для ES7.

Я согласен, что это было бы полезно.

Тем временем, если кто-то застрял прямо сейчас, я нашел эту статью полезной для объяснения того, как написать цикл forEach с ожиданием.
https://codeburst.io/javascript-async-await-with-foreach-b6ba62bbf404

Наконец-то откопал свой старый эксперимент: #1526

+1

  • Преобразовать в асинхронный метод
function makeAsync() {
  if (arguments.length < 3) return; // wrong params, not run or throw exception here!
  let fixParams = {};
  let paramLength = arguments.length;
  let method = arguments[0];
  for (let i = 1; i < arguments.length; i++) {
    fixParams[(i - 1)] = arguments[i];
  }
  return new Promise((resolve, reject) => {
    const callback = (err, result) => {
      if (err) return reject(err);
      return resolve(result);
    };

    fixParams[paramLength - 1] = callback;
    fixParams.length = paramLength;
    method.apply(null, fixParams);
  });
}

пример1:

await makeAsync(async.each, openFiles, async (file) => {
  await asyncOperation(file);
});

пример2:

const foo = async () => {
    const arr = Array.from({ length: 1000 }, (v, i) => i);
    const transformedArr = await makeAsync(async.mapLimit, arr, 100, async (v) => {
        return await Promise.resolve(v * 2);
    });
    console.log(transformedArr);
}

@tritoanst , ваша функция обещания накладная. Может быть проще:

function promisify(original) {
    return function (...args) {
        return new Promise((resolve, reject) => {
            args.push((err, result) => {
                if (err) {
                    reject(err);
                } else {
                    resolve(result);
                }
            });

            original.apply(this, args);
        });
    };
}

const foo = async () => {
    const arr = Array.from({ length: 1000 }, (v, i) => i);
    const transformedArr = await promisify(async.mapLimit)(arr, 100, async (v) => {
        return v * 2; // `return await` is redundant
    });
    console.log(transformedArr);
};
Была ли эта страница полезной?
0 / 5 - 0 рейтинги