<p>async.waterfall pecah saat diberi fungsi async (node ​​8)</p>

Dibuat pada 5 Okt 2017  ·  8Komentar  ·  Sumber: caolan/async

Versi async apa yang Anda gunakan?
2.5.0

Di lingkungan mana masalah terjadi (Versi node/versi browser)
simpul 8

Apa yang kamu lakukan?

async=require('async')

async function myFirstFunction(callback) {
     callback(null, 'one', 'two');
}

function mySecondFunction(arg1, arg2, callback) {
     // arg1 now equals 'one' and arg2 now equals 'two'
     callback(null, 'three');
}

async function myLastFunction(arg1, callback) {
     // arg1 now equals 'three'
     callback(null, 'done');
}

async.waterfall([
     myFirstFunction,
     mySecondFunction,
     myLastFunction,
], function (err, result) {
     // result now equals 'done'
     console.log(err, result)
});

Apa yang Anda harapkan terjadi?
untuk tidak memiliki pengecualian

Apa hasil sebenarnya?

> TypeError: callback is not a function
    at myFirstFunction (repl:2:5)
    at /Users/scott/node_modules/async/dist/async.js:143:27
    at /Users/scott/node_modules/async/dist/async.js:21:12
    at nextTask (/Users/scott/node_modules/async/dist/async.js:5297:14)
    at Object.waterfall (/Users/scott/node_modules/async/dist/async.js:5307:5)
    at repl:1:7
    at ContextifyScript.Script.runInThisContext (vm.js:44:33)
    at REPLServer.defaultEval (repl.js:239:29)
    at bound (domain.js:301:14)
    at REPLServer.runBound [as eval] (domain.js:314:12) undefined
docs question

Komentar yang paling membantu

Ya, Anda bisa melakukan sesuatu seperti:

async.waterfall([
  // ...
  async function (arg1, arg2) {
    //...
    const arg3 = await foo()
    return [arg1, arg2, arg3]
  },
  function ([arg1, arg2, arg3], callback) {
    //...
  }

Semua 8 komentar

Callback tidak diteruskan ke fungsi async , sebagai gantinya, cukup kembalikan nilai.

Dalam kasus fungsi pertama di atas, di mana lebih dari satu argumen diteruskan ke callback di myFirstFunction , haruskah kita mengembalikan array?

Ya, Anda bisa melakukan sesuatu seperti:

async.waterfall([
  // ...
  async function (arg1, arg2) {
    //...
    const arg3 = await foo()
    return [arg1, arg2, arg3]
  },
  function ([arg1, arg2, arg3], callback) {
    //...
  }

Lalu bagaimana cara mengembalikan kesalahan? Hanya menggunakan lemparan?

Adakah jawaban dari pertanyaan di atas? Saya percaya untuk menyelamatkan ketika menemukan kesalahan dalam fungsi async, Anda masih perlu memanggil panggilan balik "berikutnya"

Bagaimana dengan ini?

async.waterfall([
  // ...
  async function (arg1, arg2, callback) {
    //...
    try {
      const arg3 = await foo()
      return [arg1, arg2, arg3]
    } catch (err) {
      callback('An error occured:' + err.message);
    }
  },
  function ([arg1, arg2, arg3], callback) {
    //...
  }

Fungsi async tidak mendapatkan panggilan balik yang diteruskan. Hanya throw kesalahan.

Terima kasih.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat