<p>async.mapLimit tidak mengembalikan Janji</p>

Dibuat pada 27 Agu 2019  ·  14Komentar  ·  Sumber: caolan/async

Versi async apa yang Anda gunakan?
3.1.0

Di lingkungan mana masalah terjadi (Versi node/versi browser)
node 12.9.1, npm 6.10.2, browser N/A

Apa yang kamu lakukan?
Masalah memiliki utas di stackoverflow
https://stackoverflow.com/questions/57622495/async-maplimit-with-promise/57659221#57659221

Pada dasarnya, saya memiliki kode ini:

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"));

Apa yang Anda harapkan terjadi?
Jalankan tanpa kesalahan, 'numPromise' harus berisi Promise. konsol harus mencatat '2,4,6,8,10' dan ' sukses: 2,4,6,8,10'

Apa hasil sebenarnya?
Itu menimbulkan kesalahan: TypeError: Cannot read property 'then' of undefined

Catatan: Ketika saya menggunakan modul 'promise-async' alih-alih 'async' maka kode ini berfungsi dengan baik. Dokumentasi mengatakan bahwa async.mapLimit (dan lainnya) mengembalikan Janji ketika tidak ada panggilan balik yang diberikan, tetapi saya tidak terdefinisi. Belum dapat menemukan sampel yang berfungsi (lihat juga saran saya tentang masalah 'perlu sampel').

bug

Komentar yang paling membantu

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)

Semua 14 komentar

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)

Thx a lot, contoh yang masuk akal. Sayangnya, memberi saya "SyntaxError: menunggu hanya valid dalam fungsi async" (untuk 'menunggu async.mapLimit')
Ada lagi yang harus saya pertimbangkan?

Pesan kesalahan mengatakan semuanya, menunggu hanya valid dalam fungsi asinkron, hingga proposal penantian tingkat atas diimplementasikan

Yip, sedang mencari contoh yang berfungsi penuh, karena ini benar-benar bagian yang saya perjuangkan. Sudahlah, bangun dan jalankan akhirnya:

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));

Saya belum begitu yakin apa yang berbeda dengan percobaan sebelumnya, tetapi akan memvalidasi dan menambahkan beberapa kesimpulan lagi tentang ini.
Bagaimanapun, maksud saya adalah bahwa ini semua tidak sepenuhnya intuitif, saya percaya, jadi contoh seperti ini dapat membantu!
Dan... Saya masih tidak sepenuhnya mengerti mengapa kita perlu membungkus semua async/menunggu di sekitarnya, ketika async.mapLimit seharusnya mengembalikan Janji biasa dengan sendirinya...

oops saya lupa menunggu di kode saya sebelumnya, diedit

Baiklah, sekarang saya sepenuhnya mengkonfirmasi :-) Jadi mungkin masalah utamanya adalah fungsi iteratee tidak sepenuhnya asinkron?
Bagaimanapun, ini bekerja seperti pesona tampaknya dan mungkin merupakan contoh yang bagus juga! Thx untuk tetap di sini bersamaku!!

Lihat https://github.com/caolan/async/issues/1673 untuk

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)

Saya melihat, Anda benar-benar dengan saya, yaitu memiliki masalah yang sama.
Saya kira poin utama saya adalah sebagai berikut - dokumentasi hanya menyatakan "Pengembalian: Janji jika tidak ada panggilan balik yang diteruskan" - jadi, ketika saya memiliki varian panggilan balik, dan kemudian tinggalkan saja, bagaimana saya bisa berpikir bahwa saya perlu untuk menambahkan kata kunci 'async' ketika berfungsi tanpa itu di versi panggilan balik. Plus, menggunakan modul 'promise-async' berfungsi persis seperti yang saya harapkan.

Selain itu, saya belum memahami mengapa contoh 'Promise.all' di atas bekerja... ini benar-benar membingungkan saya.

Fungsi iteratee menjadi async atau menggunakan panggilan balik seharusnya tidak memengaruhi pengembalian janji jika panggilan balik terakhir dihilangkan. Ini adalah bug.

Saya berani bertaruh ini terkait dengan # 1685

Saya berani bertaruh ini terkait dengan # 1685

Saya pasti ingat pernah mengalami masalah itu sebelumnya di beberapa versi contoh kode saya juga. Saya berasumsi jelas itu disebabkan oleh beberapa pengkodean yang salah. Jadi, menarik untuk melihat bahwa itu muncul dalam rasa yang berbeda juga.

Aku melihat ke dalam ini lebih.

mapLimit berfungsi sebagaimana mestinya. Saya berani bertaruh masalah apa pun yang dilihat orang di sini adalah karena keterbatasan dalam mendeteksi fungsi yang mengembalikan janji, atau kompiler (misalnya babel, TypeScript) tidak mempertahankan fungsi async .

Aku melihat ke dalam ini lebih.

mapLimit berfungsi sebagaimana mestinya. Saya berani bertaruh masalah apa pun yang dilihat orang di sini adalah karena keterbatasan dalam mendeteksi fungsi yang mengembalikan janji, atau kompiler (misalnya babel, TypeScript) tidak mempertahankan fungsi async .

Apa cara terbaik untuk menangani skenario seperti itu di mana async tidak disimpan pada kompilasi?

Bungkus fungsi async dalam asyncify . http://caolan.github.io/async/v3/global.html#AsyncFunction

Apakah halaman ini membantu?
0 / 5 - 0 peringkat