Async: عودة الوعد إذا لم يتم توفير رد الاتصال؟

تم إنشاؤها على ٢٧ فبراير ٢٠١٨  ·  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.

أيضًا ، قد تكون بعض الطرق غير المتزامنة سخيفة جدًا مع عدم التزامن / انتظار ، على سبيل المثال series ، waterfall .

ال 8 كومينتر

تاريخيا ، كان async ضد هذا (انظر # 1086).

ومع ذلك ، مع بناء الجملة الجديد async/await ، والعقدة التي تضيف واجهات برمجة تطبيقات واعدة في المستقبل ، وزيادة الدعم للوعود ، سأكون منفتحًا على إعادة النظر في هذا. أفكار megawac ؟

لقد فكرت في هذا ، وجربته قليلاً. سيرغب الناس في الحصول على await Async.mapLimit(arr, 10, async foo => {...}) . يمكن أن يكون شيئًا جيدًا ندرجه في 3.0.

أيضًا ، قد تكون بعض الطرق غير المتزامنة سخيفة جدًا مع عدم التزامن / انتظار ، على سبيل المثال 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 التقييمات