<p>لا يُرجع async.mapLimit وعدًا</p>

تم إنشاؤها على ٢٧ أغسطس ٢٠١٩  ·  14تعليقات  ·  مصدر: caolan/async

ما هو إصدار غير متزامن الذي تستخدمه؟
3.1.0

ما البيئة التي حدثت فيها المشكلة في (إصدار العقدة / إصدار المتصفح)
العقدة 12.9.1 ، npm 6.10.2 ، المتصفح N / A

ماذا فعلت؟
المشكلة لها مؤشر ترابط في stackoverflow
https://stackoverflow.com/questions/57622495/async-maplimit-with-promise/57659221#57659221

في الأساس ، لدي هذا الرمز:

async = require('async');
let numPromise = async.mapLimit(['1','2','3','4','5'], 3, function(num, callback){
    setTimeout(function(){
        num = num * 2,
        console.log(num);
        callback(null, num);
    }, 
    2000);
})
numPromise
.then((result) => console.log("success:" + result))
.catch(() => console.log("no success"));

ماذا تتوقع أن يحدث؟
نفذ بدون أخطاء ، يجب أن يحتوي "numPromise" على وعد. يجب أن تسجل وحدة التحكم '2،4،6،8،10' و 'Success : 2 ، 4،6،8،10'

ماذا كانت النتيجة الفعلية؟
يحدث خطأ: TypeError: لا يمكن قراءة الخاصية "then" غير المعرفة

ملاحظة: عندما أستخدم وحدة "الوعد غير المتزامن" بدلاً من "غير المتزامن" ، فإن هذا الرمز يعمل بشكل جيد. تشير الوثائق إلى أن async.mapLimit (وغيرها) تُعيد وعدًا عندما لا يتم توفير رد اتصال ، ولكني أحصل على غير معرف. تعذر العثور على أي عينة عمل حتى الآن (يرجى أيضًا الاطلاع على اقتراحي بشأن مشكلة "الحاجة إلى عينات").

bug

التعليق الأكثر فائدة

const async = require('async');
const delay = require('util').promisify(setTimeout);
const numPromise = async.mapLimit(['1','2','3','4','5'], 3, async num => delay(200).then(() => num*2))
// or const numPromise = async.mapLimit(['1','2','3','4','5'], 3, async num => {
//    await delay(200);
//    return num*2;
// })
numPromise.then(console.log)

ال 14 كومينتر

const async = require('async');
const delay = require('util').promisify(setTimeout);
const numPromise = async.mapLimit(['1','2','3','4','5'], 3, async num => delay(200).then(() => num*2))
// or const numPromise = async.mapLimit(['1','2','3','4','5'], 3, async num => {
//    await delay(200);
//    return num*2;
// })
numPromise.then(console.log)

تشك كثيرا ، مثال معقول. لسوء الحظ ، أعطاني "خطأ Syntax: الانتظار صالح فقط في دالة غير متزامنة" (لـ 'await async.mapLimit')
أي شيء آخر يجب أن أفكر فيه؟

رسالة الخطأ تقول كل شيء ، انتظار صالح فقط في وظيفة غير متزامنة ، حتى يتم تنفيذ اقتراح انتظار المستوى الأعلى

Yip ، كان يبحث عن مثال عملي بالكامل ، لأن هذا هو الجزء الذي ناضلت معه حقًا. لا تهتم على الرغم من ذلك ، فقد تم تشغيله وتشغيله أخيرًا:

const myAsyncFunction = async function(){
    //const numPromise = await async.mapLimit(['1','2','3','4','5'], 3, async num => delay(200).then(() => num*2))
    const numPromise = await async.mapLimit(['1','2','3','4','5'], 3, async num => {
        await delay(2000);
        console.log(num*2);
        return num*2;
     })
    //numPromise.then(console.log)
    return numPromise;
}
myAsyncFunction()
.then((result) => console.log(result));

لست متأكدًا حتى الآن مما هو مختلف عن المحاولات السابقة ، لكنني سأقوم بالتحقق من صحة وإضافة بعض الاستنتاجات حول هذا الأمر.
على أي حال ، فإن وجهة نظري هي أن كل هذا ليس بديهيًا تمامًا ، على ما أعتقد ، لذا فإن أمثلة مثل هذه يمكن أن تساعد!
و ... ما زلت لا أفهم تمامًا سبب حاجتنا إلى التفاف كل الأشياء غير المتزامنة / المنتظرة من حولها ، عندما يجب على غير المتزامن.mapLimit إرجاع وعد بسيط من تلقاء نفسه ...

عفوًا ، لقد نسيت فترة انتظار في الكود السابق الذي تم تعديله

حسنًا ، أؤكد الآن تمامًا :-) لذا ربما كانت المشكلة الرئيسية هي أن وظيفة التكرار لم تكن غير متزامنة تمامًا؟
على أي حال ، هذا يعمل مثل السحر الذي يبدو وربما يكون مثالًا رائعًا أيضًا! شكراً لبقائك معي في هذا !!

راجع https://github.com/caolan/async/issues/1673 لمعرفة السبب

async.mapLimit(['1','2','3','4','5'], 3, async num => delay(200).then(() => num*2)) // works

async.mapLimit(['1','2','3','4','5'], 3, num => delay(200).then(() => num*2)) // doesn't work

Promise.all(['1','2','3','4','5'].map(num => delay(200).then(() => num*2))) // works (plain promises)

أرى أنك معي تمامًا ، أي لديك نفس المشكلات.
أعتقد أن نقطتي الرئيسية هي في الحقيقة ما يلي - تشير الوثائق فقط إلى "المرتجعات: وعد إذا لم يتم تمرير أي رد" - لذلك ، عندما يكون لدي متغير رد الاتصال ، ثم ببساطة اترك ذلك خارجًا ، كيف يمكنني التفكير في أنني بحاجة لإضافة الكلمة الأساسية "غير المتزامن" عندما تعمل بدون ذلك في إصدار رد الاتصال. بالإضافة إلى ذلك ، باستخدام وحدة "الوعد غير المتزامن" ، فإنها تعمل تمامًا كما توقعت.

بالإضافة إلى ذلك ، لم أفهم بعد سبب نجاح مثال "Promise.all" أعلاه ... هذا أمر محير حقًا بالنسبة لي.

لا يجب أن تؤثر وظيفة iteratee التي تكون async أو استخدام رد نداء على إرجاع الوعد إذا تم حذف رد الاتصال النهائي. هذا خطأ.

أراهن أن هذا مرتبط بـ # 1685

أراهن أن هذا مرتبط بـ # 1685

أتذكر بالتأكيد وجود هذه المشكلة من قبل في بعض إصدارات نماذج التعليمات البرمجية الخاصة بي أيضًا. افترضت أنه من الواضح أن سبب ذلك هو بعض الترميز الخاطئ. لذلك ، من المثير للاهتمام أن نرى أنه يظهر بنكهة مختلفة أيضًا.

نظرت في هذا أكثر.

mapLimit يعمل على النحو المنشود. أود أن أراهن على أي مشكلات يراها الناس هنا بسبب قيود اكتشاف وظائف إرجاع الوعد ، أو المترجمين (مثل babel ، و printcript) التي لا تحافظ على وظائف async .

نظرت في هذا أكثر.

mapLimit يعمل على النحو المنشود. أود أن أراهن على أي مشكلات يراها الناس هنا بسبب قيود اكتشاف وظائف إرجاع الوعد ، أو المترجمين (مثل babel ، و printcript) التي لا تحافظ على وظائف async .

ما هي أفضل طريقة للتعامل مع مثل هذه السيناريوهات حيث لا يتم حفظ async في التجميعات؟

لف الدالة async في asyncify . http://caolan.github.io/async/v3/global.html#AsyncFunction

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات